зеркало из 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) {
|
||||
if (!aElement.canAutocomplete)
|
||||
return [];
|
||||
|
||||
let suggestions = [];
|
||||
let autocompleteService = Cc["@mozilla.org/satchel/form-autocomplete;1"].getService(Ci.nsIFormAutoComplete);
|
||||
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) {
|
||||
let currentWrapper = this.getCurrent();
|
||||
let currentElement = currentWrapper.element;
|
||||
|
||||
switch (aEvent.keyCode) {
|
||||
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 isEnd = (currentElement.textLength == currentElement.selectionEnd);
|
||||
if (!isEnd || existSelection)
|
||||
|
@ -166,7 +184,11 @@ FormAssistant.prototype = {
|
|||
break;
|
||||
|
||||
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 isStart = (currentElement.selectionEnd == 0);
|
||||
if (!isStart || existSelection)
|
||||
|
@ -376,7 +398,13 @@ BasicWrapper.prototype = {
|
|||
|
||||
/** Element is capable of having autocomplete suggestions. */
|
||||
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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче