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 Block from '../Block';
import Node from '../../nodes/shared/Node';
import Wrapper from './shared/Wrapper'; import Wrapper from './shared/Wrapper';
import deindent from '../../../utils/deindent'; import deindent from '../../../utils/deindent';
import Document from '../../nodes/Document'; import Document from '../../nodes/Document';
@ -8,55 +6,15 @@ import Document from '../../nodes/Document';
export default class DocumentWrapper extends Wrapper { export default class DocumentWrapper extends Wrapper {
node: Document; node: Document;
constructor(renderer: Renderer, block: Block, parent: Wrapper, node: Node) {
super(renderer, block, parent, node);
}
render(block: Block, parentNode: string, parentNodes: string) { render(block: Block, parentNode: string, parentNodes: string) {
const { renderer } = this;
const { component } = renderer;
this.node.handlers.forEach(handler => { this.node.handlers.forEach(handler => {
// TODO verify that it's a valid callee (i.e. built-in or declared method) block.builders.init.addBlock(deindent`
component.addSourcemapLocations(handler.expression); document.addEventListener("${handler.name}", ${handler.snippet});
`);
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});
`);
block.builders.destroy.addBlock(deindent` block.builders.destroy.addBlock(deindent`
document.removeEventListener("${handler.name}", ${handlerName}); document.removeEventListener("${handler.name}", ${handler.snippet});
`); `);
}
}); });
} }
} }

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

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

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

Loading…
Cancel
Save