From d307d48a82592ab12290c14e8745b3196fc02cdf Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Wed, 11 May 2022 17:52:35 -0500 Subject: [PATCH] Add workaround for some ChromeOS devices unable to download HTML files (#357, #383) --- src/locales/en.json | 8 ++++ src/p4/Downloads.svelte | 73 ++++++++++++++++++++++++++++++----- src/p4/PackagerOptions.svelte | 12 +----- src/p4/download-url.js | 10 +++++ src/p4/environment.js | 2 + src/packager/packager.js | 2 +- 6 files changed, 87 insertions(+), 20 deletions(-) create mode 100644 src/p4/download-url.js diff --git a/src/locales/en.json b/src/locales/en.json index 557dbc6..171b7f9 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -467,6 +467,14 @@ "placeholder": { "string": "Downloads will appear here", "context": "Placeholder that appears when no project has been packaged yet so there is nothing to download" + }, + "useWorkaround": { + "string": "Click here if download link doesn't work", + "context": "Buttons that appears when downloading certain file types on certain systems to work around system bugs that prevent downloading files." + }, + "workaroundInProgress": { + "string": "Zipping...", + "context": "Message that appears when button to work around system download bugs is clicked as the process may take a few seconds." } }, "fileInput": { diff --git a/src/p4/Downloads.svelte b/src/p4/Downloads.svelte index 65b6421..aa73b38 100644 --- a/src/p4/Downloads.svelte +++ b/src/p4/Downloads.svelte @@ -1,21 +1,76 @@ -{#if name && url && byteLength} + + +{#if url}
-

- - {$_('downloads.link') - .replace('{size}', `${(byteLength / 1000 / 1000).toFixed(2)}MB`) - .replace('{filename}', name)} - -

+
+

+ + {$_('downloads.link') + .replace('{size}', `${(blob.size / 1000 / 1000).toFixed(2)}MB`) + .replace('{filename}', name)} + +

+ {#if isChromeOS && name.endsWith('.html')} +

+ +

+ {/if} +
{:else}
diff --git a/src/p4/PackagerOptions.svelte b/src/p4/PackagerOptions.svelte index f22d936..72e91c2 100644 --- a/src/p4/PackagerOptions.svelte +++ b/src/p4/PackagerOptions.svelte @@ -16,6 +16,7 @@ import deepClone from './deep-clone'; import Packager from '../packager/web/export'; import Task from './task'; + import downloadURL from './download-url'; export let projectData; export let title; @@ -96,15 +97,6 @@ image.src = url; }; - const downloadURL = (filename, url) => { - const link = document.createElement('a'); - link.download = filename; - link.href = url; - document.body.appendChild(link); - link.click(); - link.remove(); - }; - const runPackager = async (task, options) => { const packager = new Packager(); packager.options = options; @@ -872,5 +864,5 @@ diff --git a/src/p4/download-url.js b/src/p4/download-url.js new file mode 100644 index 0000000..3ce50a6 --- /dev/null +++ b/src/p4/download-url.js @@ -0,0 +1,10 @@ +const downloadURL = (filename, url) => { + const link = document.createElement('a'); + link.download = filename; + link.href = url; + document.body.appendChild(link); + link.click(); + link.remove(); +}; + +export default downloadURL; diff --git a/src/p4/environment.js b/src/p4/environment.js index 26fcae2..0511e08 100644 --- a/src/p4/environment.js +++ b/src/p4/environment.js @@ -3,6 +3,8 @@ export const isSupported = typeof TextDecoder === 'function'; export const isSafari = navigator.vendor === 'Apple Computer, Inc.'; +export const isChromeOS = navigator.userAgent.includes('CrOS'); + export const isStandalone = !!process.env.STANDALONE; export const version = process.env.VERSION; diff --git a/src/packager/packager.js b/src/packager/packager.js index 569f0d6..4c14ab5 100644 --- a/src/packager/packager.js +++ b/src/packager/packager.js @@ -29,7 +29,7 @@ const removeUnnecessaryEmptyLines = (string) => string.split('\n') }) .join('\n'); -const getJSZip = async () => (await import(/* webpackChunkName: "jszip" */ 'jszip')).default; +export const getJSZip = async () => (await import(/* webpackChunkName: "jszip" */ 'jszip')).default; const setFileFast = (zip, path, data) => { zip.files[path] = data;