From fbc13d6b55a5d2f8ab6852c42115946d375db526 Mon Sep 17 00:00:00 2001 From: eclipse Date: Fri, 29 Aug 2025 18:04:01 +0200 Subject: [PATCH] changed extension stuff to Manifest v3; coded the file data extraction --- .gitignore | 1 + background.js | 22 +++++++++++++++---- contentscript.js | 55 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index b24cb77..4e3b10d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.code-workspace tmp.md +utils/ \ No newline at end of file diff --git a/background.js b/background.js index da7a730..1c68273 100644 --- a/background.js +++ b/background.js @@ -1,19 +1,33 @@ -console.log("background.js started!"); +console.log("background.js starts now"); function handlePageactionClick(tab, onClickData) { console.log("background.js: executing content script"); - let executing = browser.tabs.executeScript({file: "/contentscript.js"}) + let executing = browser.scripting.executeScript({ + files: [ "/contentscript.js" ], + target: { + tabId: tab.id, + allFrames: false + } + }); executing.then(onExecuted, onExecutionError); } function onExecuted(result) { - console.log(`background.js: content script execution successful with result: ${result}`); + console.log(`background.js: content script execution successful with result: ${JSON.stringify(result)}`); } + function onExecutionError(error) { console.error(`background.js: The following error occured while executing a content script: ${error}`); } + +let gettingAllPermissions = browser.permissions.getAll(); +gettingAllPermissions.then((allPermissions) => { + console.log(JSON.stringify(allPermissions)) +}); + + + // add listener for the extension button browser.pageAction.onClicked.addListener(handlePageactionClick); - diff --git a/contentscript.js b/contentscript.js index d9bee42..6eb3809 100644 --- a/contentscript.js +++ b/contentscript.js @@ -9,34 +9,63 @@ function getCurrentDate() { } function extractFileUrlsAndNames() { - return []; +console.log("contentscript.js: this is extractFileUrlsAndNames()"); + // get the correct frame + let frame = document.querySelector("iframe.js-mail-content"); + + // get all divs containing attachments + let divs = frame.contentWindow.document.body.querySelectorAll("div.samoware-mail-message__attach__item[attachment-ref]"); + console.log(`contentscript.js: found ${divs.length} div containing attachments`); + + let urlsAndFilenames = [] + + // loop over divs and extract attachment information + divs.forEach(div => { + let url = div.getAttribute("attachment-ref"); + let filename = div.getAttribute("file-name"); + + // if filename is null, derive it from url + if ( ! filename ) { + let splitUrl = url.split("/"); + filename = splitUrl[splitUrl.length-1]; + } + urlsAndFilenames.push({url: url, filename: filename}); + }) + + //console.log(`contentscript.js: urlsAndFilenames is ${JSON.stringify(urlsAndFilenames)}`); + return urlsAndFilenames; } function onStartedDownload(id) { - console.log(`Started downloading: ${id}`); + console.log(`contentscript.js: Started downloading: ${id}`); } function onFailedToStartDownload(error) { - console.log(`Download failed: ${error}`); + console.log(`contentscript.js: Download failed: ${error}`); } - +// get today's date let currentDate = getCurrentDate(); console.log(`contentscript.js: currentDate is ${currentDate}`); -let files = extractFileUrlsAndNames(); -console.log(`contentscript.js: files is ${files}`); +let urlsAndFilenames = extractFileUrlsAndNames(); -for (let i = 0; i < files.length; i++) { - // prefix files[i].filename with currentDate - let prefixedFilename = currentDate + " " + files[i].filename; +// loop over attachments +for (let i = 0; i < urlsAndFilenames.length; i++) { + // prefix filename + let prefixedFilename = currentDate + " - " + urlsAndFilenames[i].filename; +console.log(`contentscript.js: prefixedFilename is ${prefixedFilename}`); + // start download let downloading = browser.downloads.download({ - url: files[i].url, + url: urlsAndFilenames[i].url, filename: prefixedFilename, - saveAs: (i == 0) // raise a path chooser dialog for the first file only; all later files will (hopefully!) be saved to the same folder + saveAs: i == 0 // raise a path chooser dialog for the first file only; all later files will (hopefully!) be saved to the same folder }); + console.log(`contentscript.js: downloading is ${downloading}`); + // resolve Promise downloading.then(onStartedDownload, onFailedToStartDownload); -} +} -"contentscript.js has finished"; \ No newline at end of file +console.log("contentscript.js: has finished"); +"contentscript.js: this is the final line"; \ No newline at end of file