mirror of https://github.com/vuejs/core.git
fix(runtime-dom): ensure iframe sandbox is handled as an attribute to prevent unintended behavior (#13950)
close #13946
This commit is contained in:
parent
b3cca2611c
commit
5689884c8e
|
|
@ -88,4 +88,38 @@ describe('runtime-dom: attrs patching', () => {
|
||||||
expect(el2.dataset.test).toBe(undefined)
|
expect(el2.dataset.test).toBe(undefined)
|
||||||
expect(testvalue).toBe(obj)
|
expect(testvalue).toBe(obj)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #13946
|
||||||
|
test('sandbox should be handled as attribute even if property exists', () => {
|
||||||
|
const iframe = document.createElement('iframe') as any
|
||||||
|
let propSetCount = 0
|
||||||
|
// simulate sandbox property in jsdom environment
|
||||||
|
Object.defineProperty(iframe, 'sandbox', {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true,
|
||||||
|
get() {
|
||||||
|
return this._sandbox
|
||||||
|
},
|
||||||
|
set(v) {
|
||||||
|
propSetCount++
|
||||||
|
this._sandbox = v
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
patchProp(iframe, 'sandbox', null, 'allow-scripts')
|
||||||
|
expect(iframe.getAttribute('sandbox')).toBe('allow-scripts')
|
||||||
|
expect(propSetCount).toBe(0)
|
||||||
|
|
||||||
|
patchProp(iframe, 'sandbox', 'allow-scripts', null)
|
||||||
|
expect(iframe.hasAttribute('sandbox')).toBe(false)
|
||||||
|
expect(iframe.getAttribute('sandbox')).toBe(null)
|
||||||
|
expect(propSetCount).toBe(0)
|
||||||
|
|
||||||
|
patchProp(iframe, 'sandbox', null, '')
|
||||||
|
expect(iframe.getAttribute('sandbox')).toBe('')
|
||||||
|
expect(iframe.hasAttribute('sandbox')).toBe(true)
|
||||||
|
expect(propSetCount).toBe(0)
|
||||||
|
|
||||||
|
delete iframe.sandbox
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,13 @@ function shouldSetAsProp(
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #13946 iframe.sandbox should always be set as attribute since setting
|
||||||
|
// the property to null results in 'null' string, and setting to empty string
|
||||||
|
// enables the most restrictive sandbox mode instead of no sandboxing.
|
||||||
|
if (key === 'sandbox' && el.tagName === 'IFRAME') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// #1787, #2840 form property on form elements is readonly and must be set as
|
// #1787, #2840 form property on form elements is readonly and must be set as
|
||||||
// attribute.
|
// attribute.
|
||||||
if (key === 'form') {
|
if (key === 'form') {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue