diff --git a/src/shared/rewriters/html.ts b/src/shared/rewriters/html.ts index 2a22103..e92afac 100644 --- a/src/shared/rewriters/html.ts +++ b/src/shared/rewriters/html.ts @@ -52,10 +52,13 @@ export function rewriteHtml( const script = (src) => new Element("script", { src }); + // for compatibility purpose + const base64Injected = bytesToBase64(new TextEncoder().encode(injected)); + head.children.unshift( script($scramjet.config.files.wasm), script($scramjet.config.files.shared), - script("data:application/javascript;base64," + btoa(injected)), + script("data:application/javascript;base64," + base64Injected), script($scramjet.config.files.client) ); } @@ -283,17 +286,20 @@ function traverseParsedHtml( } export function rewriteSrcset(srcset: string, meta: URLMeta) { - const urls = srcset.split(/ [0-9]+x,? ?/g); - if (!urls) return ""; - const sufixes = srcset.match(/ [0-9]+x,? ?/g); - if (!sufixes) return ""; - const rewrittenUrls = urls.map((url, i) => { - if (url && sufixes[i]) { - return rewriteUrl(url, meta) + sufixes[i]; - } + const sources = srcset.split(",").map((src) => src.trim()); + const rewrittenSources = sources.map((source) => { + // Split into URLs and descriptors (if any) + // e.g. url0, url1 1.5x, url2 2x + const [url, ...descriptors] = source.split(/\s+/); + + // Rewrite the URLs and keep the descriptors (if any) + const rewrittenUrl = rewriteUrl(url.trim(), meta); + return descriptors.length > 0 + ? `${rewrittenUrl} ${descriptors.join(" ")}` + : rewrittenUrl; }); - return rewrittenUrls.join(""); + return rewrittenSources.join(", "); } // function base64ToBytes(base64) { diff --git a/src/worker/error.ts b/src/worker/error.ts index 03e458c..927d408 100644 --- a/src/worker/error.ts +++ b/src/worker/error.ts @@ -9,6 +9,14 @@ export function errorTemplate(trace: string, fetchedURL: string) { reload.addEventListener("click", () => location.reload()); version.textContent = ${JSON.stringify($scramjet.version.version)}; build.textContent = ${JSON.stringify($scramjet.version.build)}; + + document.getElementById('copy-button').addEventListener('click', async () => { + const text = document.getElementById('errorTrace').value; + await navigator.clipboard.writeText(text); + const btn = document.getElementById('copy-button'); + btn.textContent = 'Copied!'; + setTimeout(() => btn.textContent = 'Copy', 2000); + }); `; return ` @@ -94,10 +102,11 @@ export function errorTemplate(trace: string, fetchedURL: string) { } #version-wrapper { - width: 100%; - text-align: center; + width: auto; + text-align: right; position: absolute; - bottom: 0.2rem; + top: 0.5rem; + right: 0.5rem; font-size: 0.8rem; color: var(--shore)!important; i { @@ -107,6 +116,26 @@ export function errorTemplate(trace: string, fetchedURL: string) { } z-index: 101; } + + #errorTrace-wrapper { + position: relative; + width: fit-content; + } + + #copy-button { + position: absolute; + top: 0.5em; + right: 0.5em; + padding: 0.23em; + cursor: pointer; + opacity: 0; + transition: opacity 0.4s; + font-size: 0.9em; + } + + #errorTrace-wrapper:hover #copy-button { + opacity: 1; + }
@@ -117,8 +146,10 @@ export function errorTemplate(trace: string, fetchedURL: string) {Try: