Skip to content

Commit 8620706

Browse files
authored
fix(compiler): event handlers with modifiers swallowing arguments (fix #10867) (#10958)
Pass full parent argument list to the event handler when there are event modifiers present.
1 parent 668e1e6 commit 8620706

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

src/compiler/codegen/events.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,9 @@ function genHandler (handler: ASTElementHandler | Array<ASTElementHandler>): str
148148
code += genModifierCode
149149
}
150150
const handlerCode = isMethodPath
151-
? `return ${handler.value}($event)`
151+
? `return ${handler.value}.apply(null, arguments)`
152152
: isFunctionExpression
153-
? `return (${handler.value})($event)`
153+
? `return (${handler.value}).apply(null, arguments)`
154154
: isFunctionInvocation
155155
? `return ${handler.value}`
156156
: handler.value

test/unit/modules/compiler/codegen.spec.js

+25-25
Original file line numberDiff line numberDiff line change
@@ -368,127 +368,127 @@ describe('codegen', () => {
368368
it('generate events with keycode', () => {
369369
assertCodegen(
370370
'<input @input.enter="onInput">',
371-
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return onInput($event)}}})}`
371+
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return onInput.apply(null, arguments)}}})}`
372372
)
373373
// multiple keycodes (delete)
374374
assertCodegen(
375375
'<input @input.delete="onInput">',
376-
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"delete",[8,46],$event.key,["Backspace","Delete","Del"]))return null;return onInput($event)}}})}`
376+
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"delete",[8,46],$event.key,["Backspace","Delete","Del"]))return null;return onInput.apply(null, arguments)}}})}`
377377
)
378378
// multiple keycodes (esc)
379379
assertCodegen(
380380
'<input @input.esc="onInput">',
381-
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"esc",27,$event.key,["Esc","Escape"]))return null;return onInput($event)}}})}`
381+
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"esc",27,$event.key,["Esc","Escape"]))return null;return onInput.apply(null, arguments)}}})}`
382382
)
383383
// multiple keycodes (space)
384384
assertCodegen(
385385
'<input @input.space="onInput">',
386-
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"space",32,$event.key,[" ","Spacebar"]))return null;return onInput($event)}}})}`
386+
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"space",32,$event.key,[" ","Spacebar"]))return null;return onInput.apply(null, arguments)}}})}`
387387
)
388388
// multiple keycodes (chained)
389389
assertCodegen(
390390
'<input @keydown.enter.delete="onInput">',
391-
`with(this){return _c('input',{on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter")&&_k($event.keyCode,"delete",[8,46],$event.key,["Backspace","Delete","Del"]))return null;return onInput($event)}}})}`
391+
`with(this){return _c('input',{on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter")&&_k($event.keyCode,"delete",[8,46],$event.key,["Backspace","Delete","Del"]))return null;return onInput.apply(null, arguments)}}})}`
392392
)
393393
// number keycode
394394
assertCodegen(
395395
'<input @input.13="onInput">',
396-
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&$event.keyCode!==13)return null;return onInput($event)}}})}`
396+
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&$event.keyCode!==13)return null;return onInput.apply(null, arguments)}}})}`
397397
)
398398
// custom keycode
399399
assertCodegen(
400400
'<input @input.custom="onInput">',
401-
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"custom",undefined,$event.key,undefined))return null;return onInput($event)}}})}`
401+
`with(this){return _c('input',{on:{"input":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"custom",undefined,$event.key,undefined))return null;return onInput.apply(null, arguments)}}})}`
402402
)
403403
})
404404

405405
it('generate events with generic modifiers', () => {
406406
assertCodegen(
407407
'<input @input.stop="onInput">',
408-
`with(this){return _c('input',{on:{"input":function($event){$event.stopPropagation();return onInput($event)}}})}`
408+
`with(this){return _c('input',{on:{"input":function($event){$event.stopPropagation();return onInput.apply(null, arguments)}}})}`
409409
)
410410
assertCodegen(
411411
'<input @input.prevent="onInput">',
412-
`with(this){return _c('input',{on:{"input":function($event){$event.preventDefault();return onInput($event)}}})}`
412+
`with(this){return _c('input',{on:{"input":function($event){$event.preventDefault();return onInput.apply(null, arguments)}}})}`
413413
)
414414
assertCodegen(
415415
'<input @input.self="onInput">',
416-
`with(this){return _c('input',{on:{"input":function($event){if($event.target !== $event.currentTarget)return null;return onInput($event)}}})}`
416+
`with(this){return _c('input',{on:{"input":function($event){if($event.target !== $event.currentTarget)return null;return onInput.apply(null, arguments)}}})}`
417417
)
418418
})
419419

420420
// GitHub Issues #5146
421421
it('generate events with generic modifiers and keycode correct order', () => {
422422
assertCodegen(
423423
'<input @keydown.enter.prevent="onInput">',
424-
`with(this){return _c('input',{on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;$event.preventDefault();return onInput($event)}}})}`
424+
`with(this){return _c('input',{on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;$event.preventDefault();return onInput.apply(null, arguments)}}})}`
425425
)
426426

427427
assertCodegen(
428428
'<input @keydown.enter.stop="onInput">',
429-
`with(this){return _c('input',{on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;$event.stopPropagation();return onInput($event)}}})}`
429+
`with(this){return _c('input',{on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;$event.stopPropagation();return onInput.apply(null, arguments)}}})}`
430430
)
431431
})
432432

433433
it('generate events with mouse event modifiers', () => {
434434
assertCodegen(
435435
'<input @click.ctrl="onClick">',
436-
`with(this){return _c('input',{on:{"click":function($event){if(!$event.ctrlKey)return null;return onClick($event)}}})}`
436+
`with(this){return _c('input',{on:{"click":function($event){if(!$event.ctrlKey)return null;return onClick.apply(null, arguments)}}})}`
437437
)
438438
assertCodegen(
439439
'<input @click.shift="onClick">',
440-
`with(this){return _c('input',{on:{"click":function($event){if(!$event.shiftKey)return null;return onClick($event)}}})}`
440+
`with(this){return _c('input',{on:{"click":function($event){if(!$event.shiftKey)return null;return onClick.apply(null, arguments)}}})}`
441441
)
442442
assertCodegen(
443443
'<input @click.alt="onClick">',
444-
`with(this){return _c('input',{on:{"click":function($event){if(!$event.altKey)return null;return onClick($event)}}})}`
444+
`with(this){return _c('input',{on:{"click":function($event){if(!$event.altKey)return null;return onClick.apply(null, arguments)}}})}`
445445
)
446446
assertCodegen(
447447
'<input @click.meta="onClick">',
448-
`with(this){return _c('input',{on:{"click":function($event){if(!$event.metaKey)return null;return onClick($event)}}})}`
448+
`with(this){return _c('input',{on:{"click":function($event){if(!$event.metaKey)return null;return onClick.apply(null, arguments)}}})}`
449449
)
450450
assertCodegen(
451451
'<input @click.exact="onClick">',
452-
`with(this){return _c('input',{on:{"click":function($event){if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey)return null;return onClick($event)}}})}`
452+
`with(this){return _c('input',{on:{"click":function($event){if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey)return null;return onClick.apply(null, arguments)}}})}`
453453
)
454454
assertCodegen(
455455
'<input @click.ctrl.exact="onClick">',
456-
`with(this){return _c('input',{on:{"click":function($event){if(!$event.ctrlKey)return null;if($event.shiftKey||$event.altKey||$event.metaKey)return null;return onClick($event)}}})}`
456+
`with(this){return _c('input',{on:{"click":function($event){if(!$event.ctrlKey)return null;if($event.shiftKey||$event.altKey||$event.metaKey)return null;return onClick.apply(null, arguments)}}})}`
457457
)
458458
})
459459

460460
it('generate events with multiple modifiers', () => {
461461
assertCodegen(
462462
'<input @input.stop.prevent.self="onInput">',
463-
`with(this){return _c('input',{on:{"input":function($event){$event.stopPropagation();$event.preventDefault();if($event.target !== $event.currentTarget)return null;return onInput($event)}}})}`
463+
`with(this){return _c('input',{on:{"input":function($event){$event.stopPropagation();$event.preventDefault();if($event.target !== $event.currentTarget)return null;return onInput.apply(null, arguments)}}})}`
464464
)
465465
})
466466

467467
it('generate events with capture modifier', () => {
468468
assertCodegen(
469469
'<input @input.capture="onInput">',
470-
`with(this){return _c('input',{on:{"!input":function($event){return onInput($event)}}})}`
470+
`with(this){return _c('input',{on:{"!input":function($event){return onInput.apply(null, arguments)}}})}`
471471
)
472472
})
473473

474474
it('generate events with once modifier', () => {
475475
assertCodegen(
476476
'<input @input.once="onInput">',
477-
`with(this){return _c('input',{on:{"~input":function($event){return onInput($event)}}})}`
477+
`with(this){return _c('input',{on:{"~input":function($event){return onInput.apply(null, arguments)}}})}`
478478
)
479479
})
480480

481481
it('generate events with capture and once modifier', () => {
482482
assertCodegen(
483483
'<input @input.capture.once="onInput">',
484-
`with(this){return _c('input',{on:{"~!input":function($event){return onInput($event)}}})}`
484+
`with(this){return _c('input',{on:{"~!input":function($event){return onInput.apply(null, arguments)}}})}`
485485
)
486486
})
487487

488488
it('generate events with once and capture modifier', () => {
489489
assertCodegen(
490490
'<input @input.once.capture="onInput">',
491-
`with(this){return _c('input',{on:{"~!input":function($event){return onInput($event)}}})}`
491+
`with(this){return _c('input',{on:{"~!input":function($event){return onInput.apply(null, arguments)}}})}`
492492
)
493493
})
494494

@@ -538,7 +538,7 @@ describe('codegen', () => {
538538
// with modifiers
539539
assertCodegen(
540540
`<input @keyup.enter="e=>current++">`,
541-
`with(this){return _c('input',{on:{"keyup":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return (e=>current++)($event)}}})}`
541+
`with(this){return _c('input',{on:{"keyup":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return (e=>current++).apply(null, arguments)}}})}`
542542
)
543543
})
544544

@@ -563,7 +563,7 @@ describe('codegen', () => {
563563
it('generate multiple event handlers', () => {
564564
assertCodegen(
565565
'<input @input="current++" @input.stop="onInput">',
566-
`with(this){return _c('input',{on:{"input":[function($event){current++},function($event){$event.stopPropagation();return onInput($event)}]}})}`
566+
`with(this){return _c('input',{on:{"input":[function($event){current++},function($event){$event.stopPropagation();return onInput.apply(null, arguments)}]}})}`
567567
)
568568
})
569569

0 commit comments

Comments
 (0)