GUACAMOLE-302: Do not rely on $evalAsync() for assigning focus.

$evalAsync() does not necessarily guarantee execution within a timer;
the provided function may well execute after the current $digest loop
without control returning to the browser. If we need a timer to ensure
focus() behaves reliably, we should explicitly use one via $timeout.
This commit is contained in:
Michael Jumper
2019-06-25 14:15:15 -07:00
parent e9ed4150b9
commit acaa422992

View File

@@ -20,7 +20,11 @@
/**
* A directive which allows elements to be manually focused / blurred.
*/
angular.module('element').directive('guacFocus', ['$parse', function guacFocus($parse) {
angular.module('element').directive('guacFocus', ['$injector', function guacFocus($injector) {
// Required services
var $parse = $injector.get('$parse');
var $timeout = $injector.get('$timeout');
return {
restrict: 'A',
@@ -44,7 +48,7 @@ angular.module('element').directive('guacFocus', ['$parse', function guacFocus($
// Set/unset focus depending on value of guacFocus
$scope.$watch(guacFocus, function updateFocus(value) {
$scope.$evalAsync(function updateFocusAsync() {
$timeout(function updateFocusAfterRender() {
if (value)
element.focus();
else