Skip to content

Commit 0ae2ece

Browse files
montalvomigueloMiguel Montalvo
andauthored
fix: Iframe javascript URLs (#122)
Co-authored-by: Miguel Montalvo <[email protected]>
1 parent 5d3a425 commit 0ae2ece

File tree

5 files changed

+40
-2
lines changed

5 files changed

+40
-2
lines changed

src/lib/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ export const enum NodeName {
529529
export const enum StateProp {
530530
errorHandlers = 'error',
531531
loadHandlers = 'load',
532+
src = 0,
532533
loadErrorStatus = 1,
533534
cssRules = 2,
534535
innerHTML = 3,

src/lib/web-worker/worker-iframe.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
import { getPartytownScript, resolveUrl } from './worker-exec';
1111
import { getter, sendToMain, setter } from './worker-proxy';
1212
import { HTMLSrcElementDescriptorMap } from './worker-src-element';
13-
import { setInstanceStateValue } from './worker-state';
13+
import { setInstanceStateValue, getInstanceStateValue } from './worker-state';
1414
import {
1515
StateProp,
1616
WebWorkerEnvironment,
@@ -35,10 +35,21 @@ export const patchHTMLIFrameElement = (WorkerHTMLIFrameElement: any, env: WebWor
3535

3636
src: {
3737
get() {
38-
let src = getIframeEnv(this).$location$.href;
38+
let src = getInstanceStateValue(this, StateProp.src);
39+
if (src && src.startsWith('javascript:')) {
40+
return src;
41+
}
42+
src = getIframeEnv(this).$location$.href;
3943
return src.startsWith('about:') ? '' : src;
4044
},
4145
set(src: string) {
46+
if (!src) {
47+
return;
48+
}
49+
if (src.startsWith('javascript:')) {
50+
setInstanceStateValue(this, StateProp.src, src);
51+
return;
52+
}
4253
if (!src.startsWith('about:')) {
4354
let xhr = new XMLHttpRequest();
4455
let xhrStatus: number;

src/lib/web-worker/worker-node.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ export const createNodeCstr = (
6969
if (isIFrame) {
7070
// an iframe element's instanceId is also
7171
// the winId of its contentWindow
72+
const src = getInstanceStateValue<string>(newNode, StateProp.src);
73+
if (src && src.startsWith('javascript:')) {
74+
const scriptContent = src.split('javascript:')[1];
75+
runScriptContent(env, instanceId, scriptContent, winId, '');
76+
}
7277
insertIframe(instanceId, newNode);
7378
}
7479
if (isScript) {

tests/platform/iframe/iframe.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,8 @@ test('iframe', async ({ page }) => {
135135
await page.waitForSelector('.testWindowFrames');
136136
const testWindowFrames = page.locator('#testWindowFrames');
137137
await expect(testWindowFrames).toHaveText('window-frames');
138+
139+
await page.waitForSelector('.testSetJavascriptSrc');
140+
const testSetJavascriptSrc = page.locator('#testSetJavascriptSrc');
141+
await expect(testSetJavascriptSrc).toHaveText('javascript:void(0);');
138142
});

tests/platform/iframe/index.html

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,23 @@ <h1>Iframe</h1>
854854
})();
855855
</script>
856856
</li>
857+
858+
<li>
859+
<strong>set javascript: source</strong>
860+
<code id="testSetJavascriptSrc"></code>
861+
<script type="text/partytown">
862+
(function() {
863+
const elm = document.getElementById('testSetJavascriptSrc');
864+
865+
const iframe = document.createElement('iframe');
866+
iframe.src = 'javascript:void(0);';
867+
elm.parentNode.appendChild(iframe);
868+
869+
elm.textContent = iframe.src;
870+
elm.className = 'testSetJavascriptSrc';
871+
})();
872+
</script>
873+
</li>
857874
</ul>
858875

859876
<hr />

0 commit comments

Comments
 (0)