From 02bcae9a57b8e8c68493175f03d5d2d42e62e963 Mon Sep 17 00:00:00 2001 From: bekzod Date: Wed, 30 May 2018 13:36:18 +0500 Subject: [PATCH] observed properties are enumerable when set --- .../-internals/metal/lib/property_set.ts | 10 +++++--- .../runtime/tests/system/core_object_test.js | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/@ember/-internals/metal/lib/property_set.ts b/packages/@ember/-internals/metal/lib/property_set.ts index d65dc7260fa..dae53d5390b 100644 --- a/packages/@ember/-internals/metal/lib/property_set.ts +++ b/packages/@ember/-internals/metal/lib/property_set.ts @@ -1,5 +1,5 @@ import { descriptorFor, isDescriptor, Meta, meta, peekMeta } from '@ember/-internals/meta'; -import { HAS_NATIVE_PROXY, toString } from '@ember/-internals/utils'; +import { HAS_NATIVE_PROXY, toString, lookupDescriptor } from '@ember/-internals/utils'; import { assert, deprecate } from '@ember/debug'; import { PROPERTY_BASED_DESCRIPTORS } from '@ember/deprecated-features'; import EmberError from '@ember/error'; @@ -160,9 +160,13 @@ if (DEBUG) { }; makeEnumerable = (obj: object, key: string) => { - let desc = Object.getOwnPropertyDescriptor(obj, key); + let desc = lookupDescriptor(obj, key); - if (desc && desc.set && (desc.set as MandatorySetterFunction).isMandatorySetter) { + if ( + desc !== null && + desc.set !== undefined && + (desc.set as MandatorySetterFunction).isMandatorySetter + ) { desc.enumerable = true; Object.defineProperty(obj, key, desc); } diff --git a/packages/@ember/-internals/runtime/tests/system/core_object_test.js b/packages/@ember/-internals/runtime/tests/system/core_object_test.js index af3380fa6e9..41d9576db2e 100644 --- a/packages/@ember/-internals/runtime/tests/system/core_object_test.js +++ b/packages/@ember/-internals/runtime/tests/system/core_object_test.js @@ -110,5 +110,28 @@ moduleFor( }, }).create(options); } + + ['@test observed properties are enumerable when set GH#14594'](assert) { + let callCount = 0; + let Test = CoreObject.extend({ + myProp: null, + anotherProp: undefined, + didChangeMyProp: observer('myProp', function() { + callCount++; + }), + }); + + let test = Test.create(); + set(test, 'id', '3'); + set(test, 'myProp', { id: 1 }); + + assert.deepEqual(Object.keys(test).sort(), ['id', 'myProp']); + + set(test, 'anotherProp', 'nice'); + + assert.deepEqual(Object.keys(test).sort(), ['anotherProp', 'id', 'myProp']); + + assert.equal(callCount, 1); + } } );