[HTML5] Drag and drop zip in project manager.

With a very nice hack, a new hidden configuration option that delays
dropped files removal at exit.

This still leaks while the project manager is running, but will clear
memory as soon as it exits or load something.
(reminder, dropped files are reguarly removed after the signal is
emitted specifically to avoid leaks, but I prefer hacking the HTML5
config then the project manager).
This commit is contained in:
Fabio Alessandrelli 2021-03-12 01:59:16 +01:00
parent 08767a16fd
commit f1e810adcb
4 changed files with 50 additions and 28 deletions

View File

@ -502,7 +502,7 @@
showTab('loader'); showTab('loader');
setLoaderEnabled(true); setLoaderEnabled(true);
}; };
editor.start({'args': args}); editor.start({'args': args, 'persistentDrops': is_project_manager});
}); });
}, 0); }, 0);
OnEditorExit = null; OnEditorExit = null;
@ -563,7 +563,7 @@
//selectVideoMode(); //selectVideoMode();
showTab('editor'); showTab('editor');
setLoaderEnabled(false); setLoaderEnabled(false);
editor.start({'args': ['--video-driver', video_driver]}).then(function() { editor.start({'args': ['--project-manager', '--video-driver', video_driver], 'persistentDrops': true}).then(function() {
setStatusMode('hidden'); setStatusMode('hidden');
initializing = false; initializing = false;
}); });

View File

@ -103,6 +103,11 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
* @type {Array.<string>} * @type {Array.<string>}
*/ */
persistentPaths: ['/userfs'], persistentPaths: ['/userfs'],
/**
* @ignore
* @type {boolean}
*/
persistentDrops: false,
/** /**
* @ignore * @ignore
* @type {Array.<string>} * @type {Array.<string>}
@ -231,6 +236,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
this.locale = parse('locale', this.locale); this.locale = parse('locale', this.locale);
this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy); this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy);
this.persistentPaths = parse('persistentPaths', this.persistentPaths); this.persistentPaths = parse('persistentPaths', this.persistentPaths);
this.persistentDrops = parse('persistentDrops', this.persistentDrops);
this.experimentalVK = parse('experimentalVK', this.experimentalVK); this.experimentalVK = parse('experimentalVK', this.experimentalVK);
this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs); this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs);
this.fileSizes = parse('fileSizes', this.fileSizes); this.fileSizes = parse('fileSizes', this.fileSizes);
@ -316,6 +322,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
'canvas': this.canvas, 'canvas': this.canvas,
'canvasResizePolicy': this.canvasResizePolicy, 'canvasResizePolicy': this.canvasResizePolicy,
'locale': locale, 'locale': locale,
'persistentDrops': this.persistentDrops,
'virtualKeyboard': this.experimentalVK, 'virtualKeyboard': this.experimentalVK,
'onExecute': this.onExecute, 'onExecute': this.onExecute,
'onExit': function (p_code) { 'onExit': function (p_code) {

View File

@ -192,16 +192,29 @@ const GodotDisplayDragDrop = {
GodotDisplayDragDrop.promises = []; GodotDisplayDragDrop.promises = [];
GodotDisplayDragDrop.pending_files = []; GodotDisplayDragDrop.pending_files = [];
callback(drops); callback(drops);
const dirs = [DROP.substr(0, DROP.length - 1)]; if (GodotConfig.persistent_drops) {
// Delay removal at exit.
GodotOS.atexit(function (resolve, reject) {
GodotDisplayDragDrop.remove_drop(files, DROP);
resolve();
});
} else {
GodotDisplayDragDrop.remove_drop(files, DROP);
}
});
},
remove_drop: function (files, drop_path) {
const dirs = [drop_path.substr(0, drop_path.length - 1)];
// Remove temporary files // Remove temporary files
files.forEach(function (file) { files.forEach(function (file) {
FS.unlink(file); FS.unlink(file);
let dir = file.replace(DROP, ''); let dir = file.replace(drop_path, '');
let idx = dir.lastIndexOf('/'); let idx = dir.lastIndexOf('/');
while (idx > 0) { while (idx > 0) {
dir = dir.substr(0, idx); dir = dir.substr(0, idx);
if (dirs.indexOf(DROP + dir) === -1) { if (dirs.indexOf(drop_path + dir) === -1) {
dirs.push(DROP + dir); dirs.push(drop_path + dir);
} }
idx = dir.lastIndexOf('/'); idx = dir.lastIndexOf('/');
} }
@ -219,7 +232,6 @@ const GodotDisplayDragDrop = {
}).forEach(function (dir) { }).forEach(function (dir) {
FS.rmdir(dir); FS.rmdir(dir);
}); });
});
}, },
handler: function (callback) { handler: function (callback) {

View File

@ -60,6 +60,7 @@ const GodotConfig = {
locale: 'en', locale: 'en',
canvas_resize_policy: 2, // Adaptive canvas_resize_policy: 2, // Adaptive
virtual_keyboard: false, virtual_keyboard: false,
persistent_drops: false,
on_execute: null, on_execute: null,
on_exit: null, on_exit: null,
@ -68,6 +69,7 @@ const GodotConfig = {
GodotConfig.canvas = p_opts['canvas']; GodotConfig.canvas = p_opts['canvas'];
GodotConfig.locale = p_opts['locale'] || GodotConfig.locale; GodotConfig.locale = p_opts['locale'] || GodotConfig.locale;
GodotConfig.virtual_keyboard = p_opts['virtualKeyboard']; GodotConfig.virtual_keyboard = p_opts['virtualKeyboard'];
GodotConfig.persistent_drops = !!p_opts['persistentDrops'];
GodotConfig.on_execute = p_opts['onExecute']; GodotConfig.on_execute = p_opts['onExecute'];
GodotConfig.on_exit = p_opts['onExit']; GodotConfig.on_exit = p_opts['onExit'];
}, },
@ -80,6 +82,7 @@ const GodotConfig = {
GodotConfig.locale = 'en'; GodotConfig.locale = 'en';
GodotConfig.canvas_resize_policy = 2; GodotConfig.canvas_resize_policy = 2;
GodotConfig.virtual_keyboard = false; GodotConfig.virtual_keyboard = false;
GodotConfig.persistent_drops = false;
GodotConfig.on_execute = null; GodotConfig.on_execute = null;
GodotConfig.on_exit = null; GodotConfig.on_exit = null;
}, },