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(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
|
||||
}
|
||||
|
||||
// #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
|
||||
// attribute.
|
||||
if (key === 'form') {
|
||||
|
|
|
|||
Loading…
Reference in New Issue