From f3eca1c5cf03973e8c0cce2d8d4545eac10574d8 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 | 25 ++++++++++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/packages/@ember/-internals/metal/lib/property_set.ts b/packages/@ember/-internals/metal/lib/property_set.ts index a54d057ff12..2d965d6fd8e 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'; @@ -152,9 +152,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..f48e625d430 100644 --- a/packages/@ember/-internals/runtime/tests/system/core_object_test.js +++ b/packages/@ember/-internals/runtime/tests/system/core_object_test.js @@ -1,5 +1,5 @@ import { getOwner, setOwner } from '@ember/-internals/owner'; -import { get } from '@ember/-internals/metal'; +import { get, set, observer } from '@ember/-internals/metal'; import CoreObject from '../../lib/system/core_object'; import { moduleFor, AbstractTestCase, buildOwner } from 'internal-test-helpers'; @@ -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); + } } );