mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 05:31:22 +00:00
GUACAMOLE-55: Use the files collection if the clipboard data does not define an items collection.
This commit is contained in:
@@ -113,30 +113,66 @@ angular.module('clipboard').directive('guacClipboard', ['$injector',
|
|||||||
*/
|
*/
|
||||||
var element = $element[0];
|
var element = $element[0];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all files currently contained within the local clipboard,
|
||||||
|
* given a ClipboardEvent which should contain the current clipboard
|
||||||
|
* data. If no files are contained within the local clipboard, null
|
||||||
|
* is returned.
|
||||||
|
*
|
||||||
|
* @param {ClipboardEvent} e
|
||||||
|
* The ClipboardEvent which should contain the current clipboard
|
||||||
|
* data.
|
||||||
|
*
|
||||||
|
* @returns {File[]}
|
||||||
|
* An array of all files currently contained with the clipboard, as
|
||||||
|
* provided by the given ClipboardEvent, or null if no files are
|
||||||
|
* present.
|
||||||
|
*/
|
||||||
|
var getClipboardFiles = function getClipboardFiles(e) {
|
||||||
|
|
||||||
|
// Pull the clipboard data object
|
||||||
|
var clipboardData = e.clipboardData || $window.clipboardData;
|
||||||
|
|
||||||
|
// Read from the standard clipboard API items collection first
|
||||||
|
var items = clipboardData.items;
|
||||||
|
if (items) {
|
||||||
|
|
||||||
|
var files = [];
|
||||||
|
|
||||||
|
// Produce array of all files from clipboard data
|
||||||
|
for (var i = 0; i < items.length; i++) {
|
||||||
|
if (items[i].kind === 'file')
|
||||||
|
files.push(items[i].getAsFile());
|
||||||
|
}
|
||||||
|
|
||||||
|
return files;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Failing that, try the files collection
|
||||||
|
if (clipboardData.files)
|
||||||
|
return clipboardData.files;
|
||||||
|
|
||||||
|
// No files accessible within given data
|
||||||
|
return null;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
// Intercept paste events, handling image data specifically
|
// Intercept paste events, handling image data specifically
|
||||||
element.addEventListener('paste', function dataPasted(e) {
|
element.addEventListener('paste', function dataPasted(e) {
|
||||||
|
|
||||||
// Always clear the current clipboard contents upon paste
|
// Read all files from the clipboard data within the event
|
||||||
element.innerHTML = '';
|
var files = getClipboardFiles(e);
|
||||||
|
if (!files)
|
||||||
// If we can't read the clipboard contents at all, abort
|
|
||||||
var clipboardData = e.clipboardData;
|
|
||||||
if (!clipboardData)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If the clipboard contents cannot be read as blobs, abort
|
|
||||||
var items = clipboardData.items;
|
|
||||||
if (!items)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// For each item within the clipboard
|
// For each item within the clipboard
|
||||||
for (var i = 0; i < items.length; i++) {
|
for (var i = 0; i < files.length; i++) {
|
||||||
|
|
||||||
// If the item is an image, attempt to read that image
|
var file = files[i];
|
||||||
if (items[i].kind === 'file' && /^image\//.exec(items[i].type)) {
|
|
||||||
|
|
||||||
// Retrieven contents as a File
|
// If the file is an image, attempt to read that image
|
||||||
var file = items[i].getAsFile();
|
if (/^image\//.exec(file.type)) {
|
||||||
|
|
||||||
// Set clipboard data to contents
|
// Set clipboard data to contents
|
||||||
$scope.$apply(function setClipboardData() {
|
$scope.$apply(function setClipboardData() {
|
||||||
|
Reference in New Issue
Block a user