From 905f6dbcebd8a7f31d6ed68a01d04baf3cc4f63d 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 | 11 +++++--- .../runtime/tests/system/core_object_test.js | 25 ++++++++++++++++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/@ember/-internals/metal/lib/property_set.ts b/packages/@ember/-internals/metal/lib/property_set.ts index ec3053461c3..810db8ee550 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, 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 } from '@ember/debug'; import EmberError from '@ember/error'; import { DEBUG } from '@glimmer/env'; @@ -19,6 +19,7 @@ let setWithMandatorySetter: void; + let makeEnumerable: (obj: object, keyName: string) => void; /** @@ -125,9 +126,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 ed37a167569..53feac6c247 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'; @@ -106,5 +106,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); + } } );