What I want to achieve: Upon clicking icon of my Chrome extension, a file with downloaded from remote location and the user is presented with saveAs dialog.
Caveats: I'm using latest manifest from Google, namely v3.
I have edited this post many times as I I was able to achieve more and more. I leave only my latest code.
tl;dr Now almost everything works.Crucial thing is missing: response from server (body) is not saved. Instead string [object Object] is saved.
// when icon is clicked
chrome.action.onClicked.addListener(tab => {
if (tab.url.startsWith('http')) {
post({url: tab.url})
.then(async res => ({
filename: getFilename(res.headers.get('Content-Disposition')),
blob: await res.blob()
}))
.then(response => {
console.log(response);
chrome.scripting.executeScript({
target: {tabId: tab.id},
func: saveFile,
args: [response.filename, response.blob],
})
})
.catch((error) => chrome.scripting.executeScript({
target: {tabId: tab.id},
func: showAlert,
args: [error],
}));
}
});
function getFilename(header) {
return /filename="(.+)"/.exec(header)[1];
}
async function post(data = {}) {
return await fetch('http://localhost:5000/citation',{
method: 'POST',
body: new URLSearchParams(data)
});
}
function showAlert(error) {
let message = error.error !== null ? error.error : error.message;
alert("Error: " + message);
}
async function saveFile(filename, blob) {
let link = document.createElement('a');
let url = window.URL.createObjectURL(new Blob([blob],
{type: 'application/octet-stream'}));
link.href = url;
link.download = filename;
link.click();
// For Firefox it is necessary to delay revoking the ObjectURL.
setTimeout(() => {
window.URL.revokeObjectURL(url);
}, 250);
}
from Transfer response from remote server to content script (Chrome extension)
No comments:
Post a Comment