document events

pull/1864/head
Rich Harris 7 years ago
parent 83318b6bf5
commit bc0f381b34

@ -1,6 +1,4 @@
import Renderer from '../Renderer';
import Block from '../Block';
import Node from '../../nodes/shared/Node';
import Wrapper from './shared/Wrapper';
import deindent from '../../../utils/deindent';
import Document from '../../nodes/Document';
@ -8,55 +6,15 @@ import Document from '../../nodes/Document';
export default class DocumentWrapper extends Wrapper {
node: Document;
constructor(renderer: Renderer, block: Block, parent: Wrapper, node: Node) {
super(renderer, block, parent, node);
}
render(block: Block, parentNode: string, parentNodes: string) {
const { renderer } = this;
const { component } = renderer;
this.node.handlers.forEach(handler => {
// TODO verify that it's a valid callee (i.e. built-in or declared method)
component.addSourcemapLocations(handler.expression);
const isCustomEvent = false; // TODO!!!
let usesState = handler.expression.dependencies.size > 0;
handler.render(component, block, 'document', false); // TODO hoist?
const handlerName = block.getUniqueName(`onwindow${handler.name}`);
const handlerBody = deindent`
${usesState && `var ctx = #component.get();`}
${handler.snippet};
`;
if (isCustomEvent) {
// TODO dry this out
block.addVariable(handlerName);
block.builders.hydrate.addBlock(deindent`
${handlerName} = %events-${handler.name}.call(#component, document, function(event) {
${handlerBody}
});
`);
block.builders.destroy.addLine(deindent`
${handlerName}.destroy();
`);
} else {
block.builders.init.addBlock(deindent`
function ${handlerName}(event) {
${handlerBody}
}
document.addEventListener("${handler.name}", ${handlerName});
document.addEventListener("${handler.name}", ${handler.snippet});
`);
block.builders.destroy.addBlock(deindent`
document.removeEventListener("${handler.name}", ${handlerName});
document.removeEventListener("${handler.name}", ${handler.snippet});
`);
}
});
}
}

@ -1,6 +1,4 @@
export default {
solo: 1,
compileOptions: {
dev: true
},

@ -1,11 +1,13 @@
export default {
test(assert, component, target, window) {
assert.equal(component.events.toString(), '');
assert.deepEqual(component.events, []);
const event1 = new window.Event('mouseenter');
window.document.dispatchEvent(event1);
assert.equal(component.events.toString(), 'enter');
assert.deepEqual(component.events, ['enter']);
const event2 = new window.Event('mouseleave');
window.document.dispatchEvent(event2);
assert.equal(component.events.toString(), 'enter,leave');
assert.deepEqual(component.events, ['enter', 'leave']);
},
};

@ -2,7 +2,7 @@
export let events = [];
function log(event) {
events = this.get().events.concat(event);
events.push(event);
}
</script>

Loading…
Cancel
Save