'use strict'; function errMsg(err) { return String((err && err.message) || err); } browser.runtime.onMessage.addListener((msg, sender, sendResponse) => { if (msg && msg.type === 'scrape-study-load') { browser.tabs.query({ active: true, currentWindow: true }) .then((tabs) => { const tab = tabs[0]; if (!tab || tab.id == null) throw new Error('No active tab.'); return browser.tabs.sendMessage(tab.id, { type: 'scrape-study-load' }); }) .then((data) => sendResponse(data)) .catch((err) => sendResponse({ ok: false, error: errMsg(err) })); return true; } if (msg && msg.type === 'generate-pdf') { generatePdf(msg.data) .then(() => sendResponse({ ok: true })) .catch((err) => sendResponse({ ok: false, error: errMsg(err) })); return true; } }); async function generatePdf(data) { const bytes = await ISMIStools.buildStudyLoadPdf(data); const blob = new Blob([bytes], { type: 'application/pdf' }); const url = URL.createObjectURL(blob); const name = (data.header && data.header.fullName) || 'Student'; const filename = 'Study Load - ' + name + '.pdf'; try { const id = await browser.downloads.download({ url, filename, saveAs: true }); const onChanged = (delta) => { if (delta.id === id && delta.state && (delta.state.current === 'complete' || delta.state.current === 'interrupted')) { browser.downloads.onChanged.removeListener(onChanged); URL.revokeObjectURL(url); } }; browser.downloads.onChanged.addListener(onChanged); } catch (err) { URL.revokeObjectURL(url); throw err; } }