зеркало из https://github.com/mozilla/gecko-dev.git
Bug 560426 - Form fill interferes with custom input autocomplete arrow keys [r=mfinkle]
This commit is contained in:
Родитель
8445a52d42
Коммит
769551050c
|
@ -1477,6 +1477,9 @@ var FormHelper = {
|
||||||
},
|
},
|
||||||
|
|
||||||
getAutocompleteSuggestions: function(aElement) {
|
getAutocompleteSuggestions: function(aElement) {
|
||||||
|
if (!aElement.canAutocomplete)
|
||||||
|
return [];
|
||||||
|
|
||||||
let suggestions = [];
|
let suggestions = [];
|
||||||
let autocompleteService = Cc["@mozilla.org/satchel/form-autocomplete;1"].getService(Ci.nsIFormAutoComplete);
|
let autocompleteService = Cc["@mozilla.org/satchel/form-autocomplete;1"].getService(Ci.nsIFormAutoComplete);
|
||||||
let results = autocompleteService.autoCompleteSearch(aElement.name, aElement.value, aElement, null);
|
let results = autocompleteService.autoCompleteSearch(aElement.name, aElement.value, aElement, null);
|
||||||
|
|
|
@ -148,13 +148,31 @@ FormAssistant.prototype = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_els: Cc["@mozilla.org/eventlistenerservice;1"].getService(Ci.nsIEventListenerService),
|
||||||
|
_hasKeyListener: function _hasKeyListener(aElement) {
|
||||||
|
let els = this._els;
|
||||||
|
let listeners = els.getListenerInfoFor(aElement, {});
|
||||||
|
for (let i = 0; i < listeners.length; i++) {
|
||||||
|
let listener = listeners[i];
|
||||||
|
if (["keyup", "keydown", "keypress"].indexOf(listener.type) != -1
|
||||||
|
&& !listener.inSystemEventGroup) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
handleEvent: function formHelperHandleEvent(aEvent) {
|
handleEvent: function formHelperHandleEvent(aEvent) {
|
||||||
let currentWrapper = this.getCurrent();
|
let currentWrapper = this.getCurrent();
|
||||||
let currentElement = currentWrapper.element;
|
let currentElement = currentWrapper.element;
|
||||||
|
|
||||||
switch (aEvent.keyCode) {
|
switch (aEvent.keyCode) {
|
||||||
case aEvent.DOM_VK_DOWN:
|
case aEvent.DOM_VK_DOWN:
|
||||||
if (currentElement instanceof HTMLTextAreaElement) {
|
if (currentElement instanceof HTMLInputElement && !currentWrapper.canAutocomplete()) {
|
||||||
|
if (this._hasKeyListener(currentElement))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (currentElement instanceof HTMLTextAreaElement) {
|
||||||
let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
|
let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
|
||||||
let isEnd = (currentElement.textLength == currentElement.selectionEnd);
|
let isEnd = (currentElement.textLength == currentElement.selectionEnd);
|
||||||
if (!isEnd || existSelection)
|
if (!isEnd || existSelection)
|
||||||
|
@ -166,7 +184,11 @@ FormAssistant.prototype = {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case aEvent.DOM_VK_UP:
|
case aEvent.DOM_VK_UP:
|
||||||
if (currentElement instanceof HTMLTextAreaElement) {
|
if (currentElement instanceof HTMLInputElement && !currentWrapper.canAutocomplete()) {
|
||||||
|
if (this._hasKeyListener(currentElement))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (currentElement instanceof HTMLTextAreaElement) {
|
||||||
let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
|
let existSelection = currentElement.selectionEnd - currentElement.selectionStart;
|
||||||
let isStart = (currentElement.selectionEnd == 0);
|
let isStart = (currentElement.selectionEnd == 0);
|
||||||
if (!isStart || existSelection)
|
if (!isStart || existSelection)
|
||||||
|
@ -376,7 +398,13 @@ BasicWrapper.prototype = {
|
||||||
|
|
||||||
/** Element is capable of having autocomplete suggestions. */
|
/** Element is capable of having autocomplete suggestions. */
|
||||||
canAutocomplete: function() {
|
canAutocomplete: function() {
|
||||||
return this.element instanceof HTMLInputElement;
|
if (this.element instanceof HTMLInputElement) {
|
||||||
|
let autocomplete = this.element.getAttribute("autocomplete");
|
||||||
|
let allowedValues = ["off", "false", "disabled"];
|
||||||
|
if (allowedValues.indexOf(autocomplete) == -1)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
autocomplete: function(aValue) {
|
autocomplete: function(aValue) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче