Skip to content

Commit 3a75a53

Browse files
joshualoehr-smarjoshualoehr
authored andcommitted
fix: prevent duplicate child cloning of iframe content
1 parent 05a2712 commit 3a75a53

File tree

5 files changed

+39
-8
lines changed

5 files changed

+39
-8
lines changed

src/clone-node.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,6 @@ async function cloneChildren<T extends HTMLElement>(
7676

7777
if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {
7878
children = toArray<T>(nativeNode.assignedNodes())
79-
} else if (
80-
isInstanceOfElement(nativeNode, HTMLIFrameElement) &&
81-
nativeNode.contentDocument?.body
82-
) {
83-
children = toArray<T>(nativeNode.contentDocument.body.childNodes)
8479
} else {
8580
children = toArray<T>((nativeNode.shadowRoot ?? nativeNode).childNodes)
8681
}
@@ -133,11 +128,11 @@ function cloneCSSStyle<T extends HTMLElement>(nativeNode: T, clonedNode: T) {
133128
) {
134129
value = 'block'
135130
}
136-
131+
137132
if (name === 'd' && clonedNode.getAttribute('d')) {
138133
value = `path(${clonedNode.getAttribute('d')})`
139134
}
140-
135+
141136
targetStyle.setProperty(
142137
name,
143138
value,
@@ -171,7 +166,10 @@ function cloneSelectValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {
171166
}
172167

173168
function decorate<T extends HTMLElement>(nativeNode: T, clonedNode: T): T {
174-
if (isInstanceOfElement(clonedNode, Element)) {
169+
if (
170+
isInstanceOfElement(clonedNode, Element) &&
171+
!isInstanceOfElement(nativeNode, HTMLIFrameElement)
172+
) {
175173
cloneCSSStyle(nativeNode, clonedNode)
176174
clonePseudoElements(nativeNode, clonedNode)
177175
cloneInputValue(nativeNode, clonedNode)

test/resources/iframe/embed.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<html>
2+
<body>
3+
<div>Embeddable content</div>
4+
</body>
5+
</html>

test/resources/iframe/image

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
data:image/png;base64,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

test/resources/iframe/node.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<iframe
2+
id="iframe"
3+
src="/base/test/resources/iframe/embed.html"
4+
width="100"
5+
height="100"
6+
></iframe>

test/spec/iframe.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* eslint-disable promise/no-callback-in-promise */
2+
3+
import './setup'
4+
import { bootstrap, renderAndCheck } from './helper'
5+
import { delay } from '../../src/util'
6+
7+
describe('work with iframe element', () => {
8+
it('should render iframe element', (done) => {
9+
bootstrap('iframe/node.html', undefined, 'iframe/image')
10+
.then(delay(100))
11+
.then((node) => {
12+
const iframe = node.querySelector('#iframe') as HTMLIFrameElement
13+
return renderAndCheck(node, {
14+
width: parseInt(iframe.width, 10),
15+
height: parseInt(iframe.height, 10),
16+
})
17+
})
18+
.then(done)
19+
.catch(done)
20+
})
21+
})

0 commit comments

Comments
 (0)