GUACAMOLE-128: Do not allow overlapping clipboard read attempts.
Project: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/commit/75a575d0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/tree/75a575d0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/diff/75a575d0 Branch: refs/heads/master Commit: 75a575d050abcca8c8dec98df39ee0b3bb322dea Parents: ab88eb2 Author: Michael Jumper <[email protected]> Authored: Sun Sep 3 16:07:21 2017 -0700 Committer: Michael Jumper <[email protected]> Committed: Sun Sep 3 18:02:46 2017 -0700 ---------------------------------------------------------------------- .../app/clipboard/services/clipboardService.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/75a575d0/guacamole/src/main/webapp/app/clipboard/services/clipboardService.js ---------------------------------------------------------------------- diff --git a/guacamole/src/main/webapp/app/clipboard/services/clipboardService.js b/guacamole/src/main/webapp/app/clipboard/services/clipboardService.js index 07091f3..939161e 100644 --- a/guacamole/src/main/webapp/app/clipboard/services/clipboardService.js +++ b/guacamole/src/main/webapp/app/clipboard/services/clipboardService.js @@ -45,6 +45,14 @@ angular.module('clipboard').factory('clipboardService', ['$injector', 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. * * @private @@ -398,8 +406,16 @@ angular.module('clipboard').factory('clipboardService', ['$injector', */ 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(); + // Mark read attempt as in progress + pendingRead = deferred.promise; + // Wait for the next event queue run before attempting to read // clipboard data (in case the copy/cut has not yet completed) $window.setTimeout(function deferredClipboardRead() { @@ -467,6 +483,9 @@ angular.module('clipboard').factory('clipboardService', ['$injector', originalElement.focus(); popSelection(); + // No read is pending any longer + pendingRead = null; + }); // Ensure clipboard element is blurred (and that the "focus" event
