add validation and test case

pull/5442/head
Tan Li Hau 5 years ago
parent 5ed6666fa6
commit a3be0c9361

@ -81,7 +81,7 @@ const valid_modifiers = new Set([
'once', 'once',
'passive', 'passive',
'nonpassive', 'nonpassive',
'self', 'self'
]); ]);
const passive_events = new Set([ const passive_events = new Set([
@ -771,6 +771,13 @@ export default class Element extends Node {
}); });
} }
if (handler.modifiers.has('passive') && handler.modifiers.has('nonpassive')) {
component.error(handler, {
code: 'invalid-event-modifier',
message: `The 'passive' and 'nonpassive' modifiers cannot be used together`
});
}
handler.modifiers.forEach(modifier => { handler.modifiers.forEach(modifier => {
if (!valid_modifiers.has(modifier)) { if (!valid_modifiers.has(modifier)) {
component.error(handler, { component.error(handler, {
@ -805,7 +812,7 @@ export default class Element extends Node {
} }
}); });
if (passive_events.has(handler.name) && handler.can_make_passive && !handler.modifiers.has('preventDefault')) { if (passive_events.has(handler.name) && handler.can_make_passive && !handler.modifiers.has('preventDefault') && !handler.modifiers.has('nonpassive')) {
// touch/wheel events should be passive by default // touch/wheel events should be passive by default
handler.modifiers.add('passive'); handler.modifiers.add('passive');
} }

@ -46,23 +46,17 @@ export default class EventHandlerWrapper {
const args = []; const args = [];
const opts = ['nonpassive', 'passive', 'once', 'capture'].filter(mod => this.node.modifiers.has(mod)); const opts = ['nonpassive', 'passive', 'once', 'capture'].filter(mod => this.node.modifiers.has(mod));
if (opts.length) { if (opts.length) {
let opts_as_string; if (opts.length === 1 && opts[0] === 'capture') {
args.push(TRUE);
if (opts[0] === 'nonpassive') { } else {
opts.shift(); args.push(x`{ ${ opts.map(opt =>
opt === 'nonpassive'
if (!opts.includes('passive')) { ? p`passive: false`
opts.push('passive'); : p`${opt}: true`
} ) } }`);
opts_as_string = opts.map(opt => p`${opt}: ${opt === 'passive' ? false : true}`); }
} } else if (block.renderer.options.dev) {
else {
opts_as_string = opts.map(opt => p`${opt}: true`);
}
args.push((opts.length === 1 && opts[0] === 'capture') ? TRUE : x`{ ${opts_as_string} }`);
}
else if (block.renderer.options.dev) {
args.push(FALSE); args.push(FALSE);
} }

@ -16,41 +16,49 @@ import {
} from "svelte/internal"; } from "svelte/internal";
function create_fragment(ctx) { function create_fragment(ctx) {
let div; let div1;
let button0; let div0;
let t1; let t1;
let button1; let button0;
let t3; let t3;
let button1;
let t5;
let button2; let button2;
let mounted; let mounted;
let dispose; let dispose;
return { return {
c() { c() {
div = element("div"); div1 = element("div");
div0 = element("div");
div0.textContent = "touch me";
t1 = space();
button0 = element("button"); button0 = element("button");
button0.textContent = "click me"; button0.textContent = "click me";
t1 = space(); t3 = space();
button1 = element("button"); button1 = element("button");
button1.textContent = "or me"; button1.textContent = "or me";
t3 = space(); t5 = space();
button2 = element("button"); button2 = element("button");
button2.textContent = "or me!"; button2.textContent = "or me!";
}, },
m(target, anchor) { m(target, anchor) {
insert(target, div, anchor); insert(target, div1, anchor);
append(div, button0); append(div1, div0);
append(div, t1); append(div1, t1);
append(div, button1); append(div1, button0);
append(div, t3); append(div1, t3);
append(div, button2); append(div1, button1);
append(div1, t5);
append(div1, button2);
if (!mounted) { if (!mounted) {
dispose = [ dispose = [
listen(div0, "touchstart", handleTouchstart, { passive: false }),
listen(button0, "click", stop_propagation(prevent_default(handleClick))), listen(button0, "click", stop_propagation(prevent_default(handleClick))),
listen(button1, "click", handleClick, { once: true, capture: true }), listen(button1, "click", handleClick, { once: true, capture: true }),
listen(button2, "click", handleClick, true), listen(button2, "click", handleClick, true),
listen(div, "touchstart", handleTouchstart, { passive: true }) listen(div1, "touchstart", handleTouchstart, { passive: true })
]; ];
mounted = true; mounted = true;
@ -60,7 +68,7 @@ function create_fragment(ctx) {
i: noop, i: noop,
o: noop, o: noop,
d(detaching) { d(detaching) {
if (detaching) detach(div); if (detaching) detach(div1);
mounted = false; mounted = false;
run_all(dispose); run_all(dispose);
} }

@ -9,6 +9,7 @@
</script> </script>
<div on:touchstart={handleTouchstart}> <div on:touchstart={handleTouchstart}>
<div on:touchstart|nonpassive={handleTouchstart}>touch me</div>
<button on:click|stopPropagation|preventDefault={handleClick}>click me</button> <button on:click|stopPropagation|preventDefault={handleClick}>click me</button>
<button on:click|once|capture={handleClick}>or me</button> <button on:click|once|capture={handleClick}>or me</button>
<button on:click|capture={handleClick}>or me!</button> <button on:click|capture={handleClick}>or me!</button>

@ -0,0 +1,15 @@
[{
"message": "The 'passive' and 'nonpassive' modifiers cannot be used together",
"code": "invalid-event-modifier",
"start": {
"line": 1,
"column": 5,
"character": 5
},
"end": {
"line": 1,
"column": 51,
"character": 51
},
"pos": 5
}]

@ -0,0 +1,3 @@
<div on:touchstart|nonpassive|passive={handleWheel}>
oops
</div>
Loading…
Cancel
Save