From 58cc7f8ed1e6d6bce60e877e3aca0dacdc6fde25 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 16 Sep 2017 14:40:02 -0400 Subject: [PATCH 1/2] allow console.* calls in event handlers. fixes #782 --- .../dom/visitors/Element/EventHandler.ts | 3 ++- src/utils/validCalleeObjects.ts | 3 +++ src/validate/html/validateEventHandler.ts | 3 ++- .../event-handler-console-log/_config.js | 23 +++++++++++++++++++ .../event-handler-console-log/main.html | 1 + 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/utils/validCalleeObjects.ts create mode 100644 test/runtime/samples/event-handler-console-log/_config.js create mode 100644 test/runtime/samples/event-handler-console-log/main.html diff --git a/src/generators/dom/visitors/Element/EventHandler.ts b/src/generators/dom/visitors/Element/EventHandler.ts index cf71794de42e..ded9abc44b3a 100644 --- a/src/generators/dom/visitors/Element/EventHandler.ts +++ b/src/generators/dom/visitors/Element/EventHandler.ts @@ -1,5 +1,6 @@ import deindent from '../../../../utils/deindent'; import flattenReference from '../../../../utils/flattenReference'; +import validCalleeObjects from '../../../../utils/validCalleeObjects'; import { DomGenerator } from '../../index'; import Block from '../../Block'; import { Node } from '../../../../interfaces'; @@ -23,7 +24,7 @@ export default function visitEventHandler( generator.addSourcemapLocations(attribute.expression); const flattened = flattenReference(attribute.expression.callee); - if (flattened.name !== 'event' && flattened.name !== 'this') { + if (!validCalleeObjects.has(flattened.name)) { // allow event.stopPropagation(), this.select() etc // TODO verify that it's a valid callee (i.e. built-in or declared method) generator.code.prependRight( diff --git a/src/utils/validCalleeObjects.ts b/src/utils/validCalleeObjects.ts new file mode 100644 index 000000000000..ad6070995a4a --- /dev/null +++ b/src/utils/validCalleeObjects.ts @@ -0,0 +1,3 @@ +const validCalleeObjects = new Set(['this', 'event', 'console']); + +export default validCalleeObjects; \ No newline at end of file diff --git a/src/validate/html/validateEventHandler.ts b/src/validate/html/validateEventHandler.ts index bc0bb23affe2..6f571806fe05 100644 --- a/src/validate/html/validateEventHandler.ts +++ b/src/validate/html/validateEventHandler.ts @@ -1,6 +1,7 @@ import flattenReference from '../../utils/flattenReference'; import list from '../utils/list'; import { Validator } from '../index'; +import validCalleeObjects from '../../utils/validCalleeObjects'; import { Node } from '../../interfaces'; const validBuiltins = new Set(['set', 'fire', 'destroy']); @@ -20,7 +21,7 @@ export default function validateEventHandlerCallee( const { name } = flattenReference(callee); - if (name === 'this' || name === 'event') return; + if (validCalleeObjects.has(name)) return; if (name === 'refs') { refCallees.push(callee); diff --git a/test/runtime/samples/event-handler-console-log/_config.js b/test/runtime/samples/event-handler-console-log/_config.js new file mode 100644 index 000000000000..26d8f9ae298d --- /dev/null +++ b/test/runtime/samples/event-handler-console-log/_config.js @@ -0,0 +1,23 @@ +export default { + data: { + foo: 42 + }, + + html: ` + + `, + + test (assert, component, target, window) { + const button = target.querySelector('button'); + const event = new window.MouseEvent('click'); + + const messages = []; + + const log = console.log; + console.log = msg => messages.push(msg); + button.dispatchEvent(event); + console.log = log; + + assert.deepEqual(messages, [42]); + } +}; diff --git a/test/runtime/samples/event-handler-console-log/main.html b/test/runtime/samples/event-handler-console-log/main.html new file mode 100644 index 000000000000..3500b96373ff --- /dev/null +++ b/test/runtime/samples/event-handler-console-log/main.html @@ -0,0 +1 @@ + \ No newline at end of file From d5ad4c007b370c0985bf4f9d4eebe24285e29c94 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 18 Sep 2017 20:59:51 -0400 Subject: [PATCH 2/2] update validation message --- src/validate/html/validateEventHandler.ts | 2 +- test/validator/samples/method-nonexistent-helper/warnings.json | 2 +- test/validator/samples/method-nonexistent/warnings.json | 2 +- test/validator/samples/window-event-invalid/warnings.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validate/html/validateEventHandler.ts b/src/validate/html/validateEventHandler.ts index 6f571806fe05..9a22bdd6c8f1 100644 --- a/src/validate/html/validateEventHandler.ts +++ b/src/validate/html/validateEventHandler.ts @@ -34,7 +34,7 @@ export default function validateEventHandlerCallee( ) return; - const validCallees = ['this.*', 'event.*'].concat( + const validCallees = ['this.*', 'event.*', 'console.*'].concat( Array.from(validBuiltins), Array.from(validator.methods.keys()) ); diff --git a/test/validator/samples/method-nonexistent-helper/warnings.json b/test/validator/samples/method-nonexistent-helper/warnings.json index 02512426a1b6..d090c4df94ca 100644 --- a/test/validator/samples/method-nonexistent-helper/warnings.json +++ b/test/validator/samples/method-nonexistent-helper/warnings.json @@ -1,5 +1,5 @@ [{ - "message": "'foo' is an invalid callee (should be one of this.*, event.*, set, fire, destroy or bar). 'foo' exists on 'helpers', did you put it in the wrong place?", + "message": "'foo' is an invalid callee (should be one of this.*, event.*, console.*, set, fire, destroy or bar). 'foo' exists on 'helpers', did you put it in the wrong place?", "pos": 18, "loc": { "line": 1, diff --git a/test/validator/samples/method-nonexistent/warnings.json b/test/validator/samples/method-nonexistent/warnings.json index 8debbf813233..d8f4e0e0cfff 100644 --- a/test/validator/samples/method-nonexistent/warnings.json +++ b/test/validator/samples/method-nonexistent/warnings.json @@ -1,5 +1,5 @@ [{ - "message": "'foo' is an invalid callee (should be one of this.*, event.*, set, fire, destroy or bar)", + "message": "'foo' is an invalid callee (should be one of this.*, event.*, console.*, set, fire, destroy or bar)", "pos": 18, "loc": { "line": 1, diff --git a/test/validator/samples/window-event-invalid/warnings.json b/test/validator/samples/window-event-invalid/warnings.json index 425c657cb106..20dc4c79faf9 100644 --- a/test/validator/samples/window-event-invalid/warnings.json +++ b/test/validator/samples/window-event-invalid/warnings.json @@ -1,5 +1,5 @@ [{ - "message": "'resize' is an invalid callee (should be one of this.*, event.*, set, fire or destroy)", + "message": "'resize' is an invalid callee (should be one of this.*, event.*, console.*, set, fire or destroy)", "loc": { "line": 1, "column": 20