Wait until clipboard target is actually focused before attempting paste.
@@ -398,13 +398,16 @@ angular.module('clipboard').factory('clipboardService', ['$injector',
var originalElement = document.activeElement;
pushSelection();
- // Clear and select the clipboard DOM element
- clipboardContent.value = '';
- clipboardContent.focus();
- selectAll(clipboardContent);
+ /**
+ * Attempts to paste the clipboard contents into the
+ * currently-focused element. The promise related to the current
+ * attempt to read the clipboard will be resolved or rejected
+ * depending on whether the attempt to paste succeeds.
+ */
+ var performPaste = function performPaste() {
// Attempt paste local clipboard into clipboard DOM element
- if (document.activeElement === clipboardContent && document.execCommand('paste')) {
+ if (document.execCommand('paste')) {
// If the pasted data is a single image, resolve with a blob
// containing that image
@@ -439,12 +442,37 @@ angular.module('clipboard').factory('clipboardService', ['$injector',
else
deferred.reject();
+ };
+
+ // Clean up event listener and selection once the paste attempt has
+ // completed
+ deferred.promise['finally'](function cleanupReadAttempt() {
+
+ // Do not use future changes in focus
+ clipboardContent.removeEventListener('focus', performPaste);
+
// Unfocus the clipboard DOM event to avoid mobile keyboard opening,
// restoring whichever element was originally focused
clipboardContent.blur();
originalElement.focus();
popSelection();
+ });
+
+ // Ensure clipboard element is blurred (and that the "focus" event
+ // will fire)
+ clipboardContent.blur();
+ clipboardContent.addEventListener('focus', performPaste);
+
+ // Clear and select the clipboard DOM element
+ clipboardContent.value = '';
+ clipboardContent.focus();
+ selectAll(clipboardContent);
+
+ // If focus failed to be set, we cannot read the clipboard
+ if (document.activeElement !== clipboardContent)
+ deferred.reject();
+
}, CLIPBOARD_READ_DELAY);
return deferred.promise;
