From 0fae80cf1d5273dca45186e63267f76c3dd79bbe Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 16 Mar 2019 11:06:38 -0400 Subject: [PATCH] maintain context for contextual binding handlers - fixes #2146 --- .../render-dom/wrappers/Element/index.ts | 7 +-- .../_config.js | 50 +++++++++++++++++++ .../main.svelte | 18 +++++++ 3 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 test/runtime/samples/binding-input-checkbox-deep-contextual-b/_config.js create mode 100644 test/runtime/samples/binding-input-checkbox-deep-contextual-b/main.svelte diff --git a/src/compile/render-dom/wrappers/Element/index.ts b/src/compile/render-dom/wrappers/Element/index.ts index 78a50d36ac..3920c72c63 100644 --- a/src/compile/render-dom/wrappers/Element/index.ts +++ b/src/compile/render-dom/wrappers/Element/index.ts @@ -290,13 +290,8 @@ export default class ElementWrapper extends Wrapper { }); } - const eventHandlerOrBindingUsesComponent = ( - this.bindings.length > 0 || - this.node.handlers.some(handler => handler.usesComponent) - ); - const eventHandlerOrBindingUsesContext = ( - this.bindings.some(binding => binding.node.usesContext) || + this.bindings.some(binding => binding.handler.usesContext) || this.node.handlers.some(handler => handler.usesContext) || this.node.actions.some(action => action.usesContext) ); diff --git a/test/runtime/samples/binding-input-checkbox-deep-contextual-b/_config.js b/test/runtime/samples/binding-input-checkbox-deep-contextual-b/_config.js new file mode 100644 index 0000000000..539a07312b --- /dev/null +++ b/test/runtime/samples/binding-input-checkbox-deep-contextual-b/_config.js @@ -0,0 +1,50 @@ +export default { + html: ` +
+

one

+
+
+

two

+
+
+

three

+
+ `, + + ssrHtml: ` +
+

one

+
+
+

two

+
+
+

three

+
+ `, + + async test({ assert, component, target, window }) { + const inputs = [ ...target.querySelectorAll('input') ]; + + const event = new window.Event('change'); + + inputs[1].checked = true; + await inputs[1].dispatchEvent(event); + + await component.clear(); + + assert.htmlEqual(target.innerHTML, ` +

one

+

three

+ `); + + inputs[1].checked = true; + await inputs[1].dispatchEvent(event); + + await component.clear(); + + assert.htmlEqual(target.innerHTML, ` +

one

+ `); + } +}; diff --git a/test/runtime/samples/binding-input-checkbox-deep-contextual-b/main.svelte b/test/runtime/samples/binding-input-checkbox-deep-contextual-b/main.svelte new file mode 100644 index 0000000000..ec90f52b73 --- /dev/null +++ b/test/runtime/samples/binding-input-checkbox-deep-contextual-b/main.svelte @@ -0,0 +1,18 @@ + + +{#each todos as todo, i} +
+ +

{todo.text}

+
+{/each} \ No newline at end of file