forked from mirrors/gecko-dev
The issue was that if a user typed a legitimate letter, then, quickly after (i.e. before the autocompletion results are here) hit Enter or Tab, the resulting input value would be erroneous. This is because we retrieve the value to insert from the autocomplete popup, which at that time, is out-of-date, for this brief moment. The fix consists in updating the preLabel property of the autocomplete popup items in order to get the proper completion if the user ever hit enter, tab or arrow right. We also take this as an opportunity to have a mechanism to be able to cancel a registered update. Differential Revision: https://phabricator.services.mozilla.com/D52376 --HG-- extra : moz-landing-system : lando
45 lines
1.2 KiB
JavaScript
45 lines
1.2 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
/**
|
|
* Create a debouncing function wrapper to only call the target function after a certain
|
|
* amount of time has passed without it being called.
|
|
*
|
|
* @param {Function} func
|
|
* The function to debounce
|
|
* @param {number} wait
|
|
* The wait period
|
|
* @param {Object} scope
|
|
* The scope to use for func
|
|
* @return {Function} The debounced function, which has a `cancel` method that the
|
|
* consumer can call to cancel any pending setTimeout callback.
|
|
*/
|
|
exports.debounce = function(func, wait, scope) {
|
|
let timer = null;
|
|
|
|
function clearTimer(resetTimer = false) {
|
|
if (timer) {
|
|
clearTimeout(timer);
|
|
}
|
|
if (resetTimer) {
|
|
timer = null;
|
|
}
|
|
}
|
|
|
|
const debouncedFunction = function() {
|
|
clearTimer();
|
|
|
|
const args = arguments;
|
|
timer = setTimeout(function() {
|
|
timer = null;
|
|
func.apply(scope, args);
|
|
}, wait);
|
|
};
|
|
|
|
debouncedFunction.cancel = clearTimer.bind(null, true);
|
|
|
|
return debouncedFunction;
|
|
};
|