From 68ac8001dee24886c1186bd85302d2e72d65aa02 Mon Sep 17 00:00:00 2001 From: Jan Jongboom Date: Wed, 21 Aug 2013 08:24:25 -0400 Subject: [PATCH] Bug 902942 - Deleting focused element doesn't update forms.js focusedElement. r=yxl --- b2g/chrome/content/forms.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/b2g/chrome/content/forms.js b/b2g/chrome/content/forms.js index 485f18c2dc69..b1ed4ebd286d 100644 --- a/b2g/chrome/content/forms.js +++ b/b2g/chrome/content/forms.js @@ -212,6 +212,7 @@ let FormAssistant = { scrollIntoViewTimeout: null, _focusedElement: null, _focusCounter: 0, // up one for every time we focus a new element + _observer: null, _documentEncoder: null, _editor: null, _editing: false, @@ -230,12 +231,18 @@ let FormAssistant = { }, setFocusedElement: function fa_setFocusedElement(element) { + let self = this; + if (element === this.focusedElement) return; if (this.focusedElement) { this.focusedElement.removeEventListener('mousedown', this); this.focusedElement.removeEventListener('mouseup', this); + if (this._observer) { + this._observer.disconnect(); + this._observer = null; + } if (!element) { this.focusedElement.blur(); } @@ -265,6 +272,24 @@ let FormAssistant = { // element. this._editor.addEditorObserver(this); } + + // If our focusedElement is removed from DOM we want to handle it properly + let MutationObserver = element.ownerDocument.defaultView.MutationObserver; + this._observer = new MutationObserver(function(mutations) { + var del = [].some.call(mutations, function(m) { + return [].some.call(m.removedNodes, function(n) { + return n === element; + }); + }); + if (del && element === this.focusedElement) { + // item was deleted, fake a blur so all state gets set correctly + self.handleEvent({ target: element, type: "blur" }); + } + }); + + this._observer.observe(element.parentNode, { + childList: true + }); } this.focusedElement = element;