aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/document.rs10
-rw-r--r--components/script/dom/element.rs17
-rwxr-xr-xcomponents/script/dom/htmlinputelement.rs20
3 files changed, 47 insertions, 0 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 71df0e70356..5c9cd57b128 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -812,6 +812,11 @@ impl Document {
elem.set_focus_state(false);
// FIXME: pass appropriate relatedTarget
self.fire_focus_event(FocusEventType::Blur, node, None);
+
+ // Notify the embedder to hide the input method.
+ if elem.input_method_type().is_some() {
+ self.send_to_constellation(ScriptMsg::HideIME);
+ }
}
self.focused.set(self.possibly_focused.get().r());
@@ -826,6 +831,11 @@ impl Document {
if focus_type == FocusType::Element {
self.send_to_constellation(ScriptMsg::Focus);
}
+
+ // Notify the embedder to display an input method.
+ if let Some(kind) = elem.input_method_type() {
+ self.send_to_constellation(ScriptMsg::ShowIME(kind));
+ }
}
}
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index a53446fd4a3..11b9168eb41 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -83,6 +83,7 @@ use html5ever::serialize::TraversalScope;
use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
use js::jsapi::Heap;
use js::jsval::JSVal;
+use msg::constellation_msg::InputMethodType;
use net_traits::request::CorsSettings;
use ref_filter_map::ref_filter_map;
use script_layout_interface::message::ReflowGoal;
@@ -1087,6 +1088,22 @@ impl Element {
None
}
+ // Returns the kind of IME control needed for a focusable element, if any.
+ pub fn input_method_type(&self) -> Option<InputMethodType> {
+ if !self.is_focusable_area() {
+ return None;
+ }
+
+ if let Some(input) = self.downcast::<HTMLInputElement>() {
+ input.input_type().as_ime_type()
+ } else if self.is::<HTMLTextAreaElement>() {
+ Some(InputMethodType::Text)
+ } else {
+ // Other focusable elements that are not input fields.
+ None
+ }
+ }
+
pub fn is_focusable_area(&self) -> bool {
if self.is_actually_disabled() {
return false;
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index 5618b366702..ab7d55d5b9a 100755
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -40,6 +40,7 @@ use dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix};
use mime_guess;
+use msg::constellation_msg::InputMethodType;
use net_traits::{CoreResourceMsg, IpcSend};
use net_traits::blob_url_store::get_blob_origin;
use net_traits::filemanager_thread::{FileManagerThreadMsg, FilterPattern};
@@ -137,6 +138,25 @@ impl InputType {
InputType::Week => "week",
}
}
+
+ pub fn as_ime_type(&self) -> Option<InputMethodType> {
+ match *self {
+ InputType::Color => Some(InputMethodType::Color),
+ InputType::Date => Some(InputMethodType::Date),
+ InputType::DatetimeLocal => Some(InputMethodType::DatetimeLocal),
+ InputType::Email => Some(InputMethodType::Email),
+ InputType::Month => Some(InputMethodType::Month),
+ InputType::Number => Some(InputMethodType::Number),
+ InputType::Password => Some(InputMethodType::Password),
+ InputType::Search => Some(InputMethodType::Search),
+ InputType::Tel => Some(InputMethodType::Tel),
+ InputType::Text => Some(InputMethodType::Text),
+ InputType::Time => Some(InputMethodType::Time),
+ InputType::Url => Some(InputMethodType::Url),
+ InputType::Week => Some(InputMethodType::Week),
+ _ => None,
+ }
+ }
}
impl<'a> From<&'a Atom> for InputType {