Bug 560426 - Form fill interferes with custom input autocomplete arrow keys [r=mfinkle]

This commit is contained in:
Vivien Nicolas 2010-07-01 22:21:21 +02:00
Родитель 8445a52d42
Коммит 769551050c
2 изменённых файлов: 34 добавлений и 3 удалений

Просмотреть файл

@ -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) {