diff --git a/b2g/chrome/content/forms.js b/b2g/chrome/content/forms.js
index 55f7ebb04dff..1c87c950cc48 100644
--- a/b2g/chrome/content/forms.js
+++ b/b2g/chrome/content/forms.js
@@ -203,6 +203,8 @@ let FormAssistant = {
scrollIntoViewTimeout: null,
_focusedElement: null,
_documentEncoder: null,
+ _editor: null,
+ _editing: false,
get focusedElement() {
if (this._focusedElement && Cu.isDeadWrapper(this._focusedElement))
@@ -228,6 +230,10 @@ let FormAssistant = {
}
this._documentEncoder = null;
+ if (this._editor) {
+ this._editor.removeEditorObserver(this);
+ this._editor = null;
+ }
if (element) {
element.addEventListener('mousedown', this);
@@ -235,6 +241,12 @@ let FormAssistant = {
if (isContentEditable(element)) {
this._documentEncoder = getDocumentEncoder(element);
}
+ this._editor = getPlaintextEditor(element);
+ if (this._editor) {
+ // Add a nsIEditorObserver to monitor the text content of the focused
+ // element.
+ this._editor.addEditorObserver(this);
+ }
}
this.focusedElement = element;
@@ -244,6 +256,15 @@ let FormAssistant = {
return this._documentEncoder;
},
+ // Implements nsIEditorObserver get notification when the text content of
+ // current input field has changed.
+ EditAction: function fa_editAction() {
+ if (this._editing) {
+ return;
+ }
+ this.sendKeyboardState(this.focusedElement);
+ },
+
handleEvent: function fa_handleEvent(evt) {
let target = evt.target;
@@ -331,10 +352,14 @@ let FormAssistant = {
break;
case "keydown":
+ // Don't monitor the text change resulting from key event.
+ this._editing = true;
+
// We use 'setTimeout' to wait until the input element accomplishes the
- // change in selection range
+ // change in selection range or text content.
content.setTimeout(function() {
this.updateSelection();
+ this._editing = false;
}.bind(this), 0);
break;
}
@@ -346,6 +371,7 @@ let FormAssistant = {
return;
}
+ this._editing = true;
let json = msg.json;
switch (msg.name) {
case "Forms:Input:Value": {
@@ -396,6 +422,8 @@ let FormAssistant = {
break;
}
}
+ this._editing = false;
+
},
showKeyboard: function fa_showKeyboard(target) {
@@ -525,7 +553,7 @@ function getJSON(element) {
let attributeType = element.getAttribute("type") || "";
if (attributeType) {
- var typeLowerCase = attributeType.toLowerCase();
+ var typeLowerCase = attributeType.toLowerCase();
switch (typeLowerCase) {
case "datetime":
case "datetime-local":
@@ -724,3 +752,27 @@ function setSelectionRange(element, start, end) {
}
}
+// Get nsIPlaintextEditor object from an input field
+function getPlaintextEditor(element) {
+ let editor = null;
+ // Get nsIEditor
+ if (element instanceof HTMLInputElement ||
+ element instanceof HTMLTextAreaElement) {
+ // Get from the and