From 2e7e39916084b06696a51c5eef7338a9755604d1 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 15 May 2024 21:38:04 -0400 Subject: [PATCH] chore: use indirect eval, avoid exposing stuff to the global scope (#11646) * chore: use indirect eval, avoid exposing stuff to the global scope * prettier --- .../src/lib/Output/srcdoc/index.html | 294 +++++++++--------- 1 file changed, 151 insertions(+), 143 deletions(-) diff --git a/sites/svelte-5-preview/src/lib/Output/srcdoc/index.html b/sites/svelte-5-preview/src/lib/Output/srcdoc/index.html index 2062beef65ad..e00819120b7b 100644 --- a/sites/svelte-5-preview/src/lib/Output/srcdoc/index.html +++ b/sites/svelte-5-preview/src/lib/Output/srcdoc/index.html @@ -85,7 +85,7 @@ if (action === 'eval') { try { const { script } = ev.data.args; - eval(script); + (0, eval)(script); send_ok(); } catch (e) { send_error(e.message, e.stack); @@ -140,160 +140,168 @@ window.addEventListener('unhandledrejection', (event) => { parent.postMessage({ action: 'unhandledrejection', value: event.reason }, '*'); }); - }).call(this); - let previous = { level: null, args: null }; + let previous = { level: null, args: null }; + + ['clear', 'log', 'info', 'dir', 'warn', 'error', 'table'].forEach((level) => { + const original = console[level]; + console[level] = (...args) => { + const stringifiedArgs = stringify(args); + if (previous.level === level && previous.args && previous.args === stringifiedArgs) { + parent.postMessage({ action: 'console', level, duplicate: true }, '*'); + } else { + previous = { level, args: stringifiedArgs }; + + try { + parent.postMessage({ action: 'console', level, args }, '*'); + } catch (err) { + parent.postMessage({ action: 'console', level: 'unclonable' }, '*'); + } + } - ['clear', 'log', 'info', 'dir', 'warn', 'error', 'table'].forEach((level) => { - const original = console[level]; - console[level] = (...args) => { - const stringifiedArgs = stringify(args); - if (previous.level === level && previous.args && previous.args === stringifiedArgs) { - parent.postMessage({ action: 'console', level, duplicate: true }, '*'); - } else { - previous = { level, args: stringifiedArgs }; + original(...args); + }; + }); - try { - parent.postMessage({ action: 'console', level, args }, '*'); - } catch (err) { - parent.postMessage({ action: 'console', level: 'unclonable' }, '*'); - } - } + [ + { method: 'group', action: 'console_group' }, + { method: 'groupEnd', action: 'console_group_end' }, + { method: 'groupCollapsed', action: 'console_group_collapsed' } + ].forEach((group_action) => { + const original = console[group_action.method]; + console[group_action.method] = (label) => { + parent.postMessage({ action: group_action.action, label }, '*'); + + original(label); + }; + }); + + const timers = new Map(); + const original_time = console.time; + const original_timelog = console.timeLog; + const original_timeend = console.timeEnd; - original(...args); + console.time = (label = 'default') => { + original_time(label); + timers.set(label, performance.now()); }; - }); - - [ - { method: 'group', action: 'console_group' }, - { method: 'groupEnd', action: 'console_group_end' }, - { method: 'groupCollapsed', action: 'console_group_collapsed' } - ].forEach((group_action) => { - const original = console[group_action.method]; - console[group_action.method] = (label) => { - parent.postMessage({ action: group_action.action, label }, '*'); - - original(label); + console.timeLog = (label = 'default') => { + original_timelog(label); + const now = performance.now(); + if (timers.has(label)) { + parent.postMessage( + { + action: 'console', + level: 'system-log', + args: [`${label}: ${now - timers.get(label)}ms`] + }, + '*' + ); + } else { + parent.postMessage( + { + action: 'console', + level: 'system-warn', + args: [`Timer '${label}' does not exist`] + }, + '*' + ); + } }; - }); - - const timers = new Map(); - const original_time = console.time; - const original_timelog = console.timeLog; - const original_timeend = console.timeEnd; - - console.time = (label = 'default') => { - original_time(label); - timers.set(label, performance.now()); - }; - console.timeLog = (label = 'default') => { - original_timelog(label); - const now = performance.now(); - if (timers.has(label)) { - parent.postMessage( - { - action: 'console', - level: 'system-log', - args: [`${label}: ${now - timers.get(label)}ms`] - }, - '*' - ); - } else { - parent.postMessage( - { action: 'console', level: 'system-warn', args: [`Timer '${label}' does not exist`] }, - '*' - ); - } - }; - console.timeEnd = (label = 'default') => { - original_timeend(label); - const now = performance.now(); - if (timers.has(label)) { - parent.postMessage( - { - action: 'console', - level: 'system-log', - args: [`${label}: ${now - timers.get(label)}ms`] - }, - '*' - ); - } else { + console.timeEnd = (label = 'default') => { + original_timeend(label); + const now = performance.now(); + if (timers.has(label)) { + parent.postMessage( + { + action: 'console', + level: 'system-log', + args: [`${label}: ${now - timers.get(label)}ms`] + }, + '*' + ); + } else { + parent.postMessage( + { + action: 'console', + level: 'system-warn', + args: [`Timer '${label}' does not exist`] + }, + '*' + ); + } + timers.delete(label); + }; + + const original_assert = console.assert; + console.assert = (condition, ...args) => { + if (condition) { + const stack = new Error().stack; + parent.postMessage({ action: 'console', level: 'assert', args, stack }, '*'); + } + original_assert(condition, ...args); + }; + + const counter = new Map(); + const original_count = console.count; + const original_countreset = console.countReset; + + console.count = (label = 'default') => { + counter.set(label, (counter.get(label) || 0) + 1); parent.postMessage( - { action: 'console', level: 'system-warn', args: [`Timer '${label}' does not exist`] }, + { action: 'console', level: 'system-log', args: `${label}: ${counter.get(label)}` }, '*' ); - } - timers.delete(label); - }; + original_count(label); + }; + + console.countReset = (label = 'default') => { + if (counter.has(label)) { + counter.set(label, 0); + } else { + parent.postMessage( + { + action: 'console', + level: 'system-warn', + args: `Count for '${label}' does not exist` + }, + '*' + ); + } + original_countreset(label); + }; + + const original_trace = console.trace; - const original_assert = console.assert; - console.assert = (condition, ...args) => { - if (condition) { + console.trace = (...args) => { const stack = new Error().stack; - parent.postMessage({ action: 'console', level: 'assert', args, stack }, '*'); - } - original_assert(condition, ...args); - }; - - const counter = new Map(); - const original_count = console.count; - const original_countreset = console.countReset; - - console.count = (label = 'default') => { - counter.set(label, (counter.get(label) || 0) + 1); - parent.postMessage( - { action: 'console', level: 'system-log', args: `${label}: ${counter.get(label)}` }, - '*' - ); - original_count(label); - }; - - console.countReset = (label = 'default') => { - if (counter.has(label)) { - counter.set(label, 0); - } else { - parent.postMessage( - { - action: 'console', - level: 'system-warn', - args: `Count for '${label}' does not exist` - }, - '*' - ); - } - original_countreset(label); - }; - - const original_trace = console.trace; - - console.trace = (...args) => { - const stack = new Error().stack; - parent.postMessage({ action: 'console', level: 'trace', args, stack }, '*'); - original_trace(...args); - }; - - function stringify(args) { - try { - return JSON.stringify(args, (key, value) => { - // if we don't do this, our Set/Map from svelte/reactivity would show up wrong in the console - if (value instanceof Map) { - return { - type: 'Map', - value - }; - } - if (value instanceof Set) { - return { - type: 'Set', - value - }; - } - return value; - }); - } catch (error) { - return null; + parent.postMessage({ action: 'console', level: 'trace', args, stack }, '*'); + original_trace(...args); + }; + + function stringify(args) { + try { + return JSON.stringify(args, (key, value) => { + // if we don't do this, our Set/Map from svelte/reactivity would show up wrong in the console + if (value instanceof Map) { + return { + type: 'Map', + value + }; + } + if (value instanceof Set) { + return { + type: 'Set', + value + }; + } + return value; + }); + } catch (error) { + return null; + } } - } + })();