From a5584317c8d001d6e47f2e45798be8ce7183a155 Mon Sep 17 00:00:00 2001 From: Nariman Jelveh Date: Fri, 15 Mar 2024 16:53:05 -0700 Subject: [PATCH] Allow apps to resize/reposition their windows The resizing and repositioning is safe from abuse in that the window's position and size cannot cause it to escape the viewport. More could be done here, e.g. rate limit resize/repos. I will request rate-limiting in a separate issue. --- src/IPC.js | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/src/IPC.js b/src/IPC.js index 18335d90..5520ee00 100644 --- a/src/IPC.js +++ b/src/IPC.js @@ -333,7 +333,6 @@ window.addEventListener('message', async (event) => { initiating_app_uuid: app_uuid, }); } - //-------------------------------------------------------- // setWindowTitle //-------------------------------------------------------- @@ -347,6 +346,98 @@ window.addEventListener('message', async (event) => { }, '*'); } //-------------------------------------------------------- + // setWindowWidth + //-------------------------------------------------------- + else if(event.data.msg === 'setWindowWidth' && event.data.width !== undefined){ + event.data.width = parseFloat(event.data.width); + // must be at least 200 + if(event.data.width < 200) + event.data.width = 200; + // set window width + $($el_parent_window).css('width', event.data.width); + // send confirmation to requester window + target_iframe.contentWindow.postMessage({ + original_msg_id: msg_id, + }, '*'); + } + //-------------------------------------------------------- + // setWindowHeight + //-------------------------------------------------------- + else if(event.data.msg === 'setWindowHeight' && event.data.height !== undefined){ + event.data.height = parseFloat(event.data.height); + // must be at least 200 + if(event.data.height < 200) + event.data.height = 200; + + // convert to number and set + $($el_parent_window).css('height', event.data.height); + + // send confirmation to requester window + target_iframe.contentWindow.postMessage({ + original_msg_id: msg_id, + }, '*'); + } + //-------------------------------------------------------- + // setWindowSize + //-------------------------------------------------------- + else if(event.data.msg === 'setWindowSize' && (event.data.width !== undefined || event.data.height !== undefined)){ + // convert to number and set + if(event.data.width !== undefined){ + event.data.width = parseFloat(event.data.width); + // must be at least 200 + if(event.data.width < 200) + event.data.width = 200; + $($el_parent_window).css('width', event.data.width); + } + + if(event.data.height !== undefined){ + event.data.height = parseFloat(event.data.height); + // must be at least 200 + if(event.data.height < 200) + event.data.height = 200; + $($el_parent_window).css('height', event.data.height); + } + + // send confirmation to requester window + target_iframe.contentWindow.postMessage({ + original_msg_id: msg_id, + }, '*'); + } + //-------------------------------------------------------- + // setWindowPosition + //-------------------------------------------------------- + else if(event.data.msg === 'setWindowPosition' && (event.data.x !== undefined || event.data.y !== undefined)){ + // convert to number and set + if(event.data.x !== undefined){ + event.data.x = parseFloat(event.data.x); + // we don't want the window to go off the left edge of the screen + if(event.data.x < 0) + event.data.x = 0; + // we don't want the window to go off the right edge of the screen + if(event.data.x > window.innerWidth - 100) + event.data.x = window.innerWidth - 100; + // set window left + $($el_parent_window).css('left', parseFloat(event.data.x)); + } + + if(event.data.y !== undefined){ + event.data.y = parseFloat(event.data.y); + // we don't want the window to go off the top edge of the screen + if(event.data.y < window.taskbar_height) + event.data.y = window.taskbar_height; + // we don't want the window to go off the bottom edge of the screen + if(event.data.y > window.innerHeight - 100) + event.data.y = window.innerHeight - 100; + // set window top + $($el_parent_window).css('top', parseFloat(event.data.y)); + } + + // send confirmation to requester window + target_iframe.contentWindow.postMessage({ + original_msg_id: msg_id, + }, '*'); + } + //-------------------------------------------------------- // watchItem //-------------------------------------------------------- else if(event.data.msg === 'watchItem' && event.data.item_uid !== undefined){