From da498d7aa5f64ee4f1bb14a2191a295e85f6b19d Mon Sep 17 00:00:00 2001 From: Scott Newcomer Date: Tue, 9 Jun 2020 22:06:47 -0500 Subject: [PATCH] [Chore]: Add integration test for accessing a property during init --- .../integration/components/tracked-test.js | 52 ++++++++++++++++++- .../runtime/lib/system/core_object.js | 2 + 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js index 10a5f5b9c97..a6342af3e9c 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js @@ -1,6 +1,12 @@ import { Object as EmberObject, A, ArrayProxy, PromiseProxyMixin } from '@ember/-internals/runtime'; import { EMBER_CUSTOM_COMPONENT_ARG_PROXY } from '@ember/canary-features'; -import { computed, get, tracked, nativeDescDecorator as descriptor } from '@ember/-internals/metal'; +import { + computed, + get, + set, + tracked, + nativeDescDecorator as descriptor, +} from '@ember/-internals/metal'; import { Promise } from 'rsvp'; import { moduleFor, RenderingTestCase, strip, runTask } from 'internal-test-helpers'; import GlimmerishComponent from '../../utils/glimmerish-component'; @@ -493,6 +499,50 @@ moduleFor( // check to make sure we can still mutate the person person.first = 'max'; } + + '@test works when EmberObject created during render'() { + this.registerComponent('test', { + ComponentClass: class extends GlimmerishComponent {}, + template: '{{@data.length}}', + }); + + let RecordMeta = new WeakMap(); + function getRecordMeta(record) { + let meta = RecordMeta.get(record); + if (meta === undefined) { + meta = Object.create(null); + RecordMeta.set(record, meta); + } + + return meta; + } + + // does not reproduce with native JS class only + class Person extends EmberObject { + get name() { + let meta = getRecordMeta(this); + let name = get(meta, 'name'); + return name; + } + set name(v) { + let meta = getRecordMeta(this); + set(meta, 'name', v); + } + } + + class List { + get records() { + let p = Person.create({ name: 'ye-haw' }); + return [p]; + } + } + + this.render('', { + data: new List(), + }); + + this.assertText('1'); + } } ); diff --git a/packages/@ember/-internals/runtime/lib/system/core_object.js b/packages/@ember/-internals/runtime/lib/system/core_object.js index 186a52c6f8f..884ca8feaca 100644 --- a/packages/@ember/-internals/runtime/lib/system/core_object.js +++ b/packages/@ember/-internals/runtime/lib/system/core_object.js @@ -105,6 +105,7 @@ function initialize(obj, properties) { let baseValue = obj[keyName]; if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) { + let baseValue = obj[keyName]; if (baseValue) { value = makeArray(baseValue).concat(value); } else { @@ -113,6 +114,7 @@ function initialize(obj, properties) { } if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) { + let baseValue = obj[keyName]; value = assign({}, baseValue, value); } }