From fb972566a4d52f38894775ece84b01067ca4f9c5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 1 Sep 2017 12:08:44 -0400 Subject: [PATCH] prevent mutation bug from incorrectly calling observer (fixes #804) --- src/generators/dom/visitors/Component.ts | 2 +- .../Nested.html | 1 + .../_config.js | 28 +++++++++++++++++++ .../main.html | 21 ++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 test/runtime/samples/observe-binding-ignores-unchanged/Nested.html create mode 100644 test/runtime/samples/observe-binding-ignores-unchanged/_config.js create mode 100644 test/runtime/samples/observe-binding-ignores-unchanged/main.html diff --git a/src/generators/dom/visitors/Component.ts b/src/generators/dom/visitors/Component.ts index 69587d5d07..edbf10a637 100644 --- a/src/generators/dom/visitors/Component.ts +++ b/src/generators/dom/visitors/Component.ts @@ -185,7 +185,7 @@ export default function visitComponent( _bind: function(changed, childState) { var state = #component.get(), newState = {}; ${setParentFromChildOnChange} - ${name_updating} = changed; + ${name_updating} = @assign({}, changed); #component._set(newState); ${name_updating} = {}; } diff --git a/test/runtime/samples/observe-binding-ignores-unchanged/Nested.html b/test/runtime/samples/observe-binding-ignores-unchanged/Nested.html new file mode 100644 index 0000000000..8f7559a778 --- /dev/null +++ b/test/runtime/samples/observe-binding-ignores-unchanged/Nested.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/runtime/samples/observe-binding-ignores-unchanged/_config.js b/test/runtime/samples/observe-binding-ignores-unchanged/_config.js new file mode 100644 index 0000000000..927572e735 --- /dev/null +++ b/test/runtime/samples/observe-binding-ignores-unchanged/_config.js @@ -0,0 +1,28 @@ +export default { + html: ` + +

field1: 1

+

field2: 2

+ `, + + test(assert, component, target, window) { + let triggered = false; + component.refs.nested.observe('field2', () => { + triggered = true; + }, { init: false }); + + const input = target.querySelector('input'); + const event = new window.Event('input'); + + input.value = 3; + input.dispatchEvent(event); // will throw error if observer fires incorrectly + + assert.ok(!triggered); + + assert.htmlEqual(target.innerHTML, ` + +

field1: 3

+

field2: 2

+ `); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/observe-binding-ignores-unchanged/main.html b/test/runtime/samples/observe-binding-ignores-unchanged/main.html new file mode 100644 index 0000000000..8cdc42f96e --- /dev/null +++ b/test/runtime/samples/observe-binding-ignores-unchanged/main.html @@ -0,0 +1,21 @@ + +

field1: {{myObject.field1}}

+

field2: {{myObject.field2}}

+ + \ No newline at end of file