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',
'passive',
'nonpassive',
'self',
'self'
]);
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 => {
if (!valid_modifiers.has(modifier)) {
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
handler.modifiers.add('passive');
}

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

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

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