From 2cbd94d7056903f7e7b55894aedcf57736d65795 Mon Sep 17 00:00:00 2001 From: bekzod Date: Wed, 30 May 2018 13:36:18 +0500 Subject: [PATCH] fix Object.keys --- packages/ember-metal/lib/property_set.ts | 10 +++++--- .../tests/system/core_object_test.js | 24 ++++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/ember-metal/lib/property_set.ts b/packages/ember-metal/lib/property_set.ts index cf3a069e65f..3df568bfa8e 100644 --- a/packages/ember-metal/lib/property_set.ts +++ b/packages/ember-metal/lib/property_set.ts @@ -3,7 +3,7 @@ import { PROPERTY_BASED_DESCRIPTORS } from '@ember/deprecated-features'; import EmberError from '@ember/error'; import { DEBUG } from '@glimmer/env'; import { descriptorFor, isDescriptor, Meta, meta, peekMeta } from 'ember-meta'; -import { HAS_NATIVE_PROXY, toString } from 'ember-utils'; +import { HAS_NATIVE_PROXY, lookupDescriptor, toString } from 'ember-utils'; import { isPath } from './path_cache'; import { Descriptor, MandatorySetterFunction } from './properties'; import { notifyPropertyChange } from './property_events'; @@ -162,9 +162,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-runtime/tests/system/core_object_test.js b/packages/ember-runtime/tests/system/core_object_test.js index dc130142da6..62e679e8b47 100644 --- a/packages/ember-runtime/tests/system/core_object_test.js +++ b/packages/ember-runtime/tests/system/core_object_test.js @@ -1,5 +1,5 @@ import { getOwner, setOwner } from 'ember-owner'; -import { get } from 'ember-metal'; +import { get, observer, setProperties, set } from 'ember-metal'; import CoreObject from '../../lib/system/core_object'; import { moduleFor, AbstractTestCase, buildOwner } from 'internal-test-helpers'; @@ -93,6 +93,28 @@ moduleFor( getOwner(proxy); } + ['@test `Object.keys` works properly'](assert) { + let callCount = 0; + let Test = CoreObject.extend({ + myProp: null, + anotherProp: undefined, + didChangeMyProp: observer('myProp', function() { + callCount++; + }), + }); + + let test = Test.create(); + setProperties(test, { id: 3, 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); + } + ['@test can use getOwner in a proxy init GH#16484'](assert) { let owner = {}; let options = {};