GUACAMOLE-128: Do not allow overlapping clipboard read attempts.

This commit is contained in:
Michael Jumper
2017-09-03 16:07:21 -07:00
parent ab88eb2ff3
commit 75a575d050

View File

@@ -44,6 +44,14 @@ angular.module('clipboard').factory('clipboardService', ['$injector',
*/ */
var CLIPBOARD_READ_DELAY = 100; var CLIPBOARD_READ_DELAY = 100;
/**
* The promise associated with the current pending clipboard read attempt.
* If no clipboard read is active, this will be null.
*
* @type Promise.<ClipboardData>
*/
var pendingRead = null;
/** /**
* Reference to the window.document object. * Reference to the window.document object.
* *
@@ -398,8 +406,16 @@ angular.module('clipboard').factory('clipboardService', ['$injector',
*/ */
service.getLocalClipboard = function getLocalClipboard() { service.getLocalClipboard = function getLocalClipboard() {
// If the clipboard is already being read, do not overlap the read
// attempts; instead share the result across all requests
if (pendingRead)
return pendingRead;
var deferred = $q.defer(); var deferred = $q.defer();
// Mark read attempt as in progress
pendingRead = deferred.promise;
// Wait for the next event queue run before attempting to read // Wait for the next event queue run before attempting to read
// clipboard data (in case the copy/cut has not yet completed) // clipboard data (in case the copy/cut has not yet completed)
$window.setTimeout(function deferredClipboardRead() { $window.setTimeout(function deferredClipboardRead() {
@@ -467,6 +483,9 @@ angular.module('clipboard').factory('clipboardService', ['$injector',
originalElement.focus(); originalElement.focus();
popSelection(); popSelection();
// No read is pending any longer
pendingRead = null;
}); });
// Ensure clipboard element is blurred (and that the "focus" event // Ensure clipboard element is blurred (and that the "focus" event