From 74039e7900c22042cbf46642cf6222a2363d5a4d Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Sat, 21 Apr 2018 13:49:42 -0400 Subject: [PATCH] [BUGFIX release] Ensure Ember.isArray does not trigger proxy assertion. --- packages/ember-runtime/lib/utils.js | 13 ++++++++++++- packages/ember-runtime/tests/core/is_array_test.js | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/ember-runtime/lib/utils.js b/packages/ember-runtime/lib/utils.js index 8332e9bf43d..f36480eb3ac 100644 --- a/packages/ember-runtime/lib/utils.js +++ b/packages/ember-runtime/lib/utils.js @@ -1,3 +1,6 @@ +import { DEBUG } from '@glimmer/env'; +import { PROXY_CONTENT } from 'ember-metal'; +import { HAS_NATIVE_PROXY } from 'ember-utils'; import EmberArray from './mixins/array'; import EmberObject from './system/object'; @@ -48,7 +51,15 @@ const { toString } = Object.prototype; @return {Boolean} true if the passed object is an array or Array-like @public */ -export function isArray(obj) { +export function isArray(_obj) { + let obj = _obj; + if (DEBUG && HAS_NATIVE_PROXY && typeof _obj === 'object' && _obj !== null) { + let possibleProxyContent = _obj[PROXY_CONTENT]; + if (possibleProxyContent !== undefined) { + obj = possibleProxyContent; + } + } + if (!obj || obj.setInterval) { return false; } diff --git a/packages/ember-runtime/tests/core/is_array_test.js b/packages/ember-runtime/tests/core/is_array_test.js index d18bcfcfeac..902d3b0432b 100644 --- a/packages/ember-runtime/tests/core/is_array_test.js +++ b/packages/ember-runtime/tests/core/is_array_test.js @@ -1,6 +1,7 @@ import { isArray } from '../../lib/utils'; import { A as emberA } from '../../lib/mixins/array'; import ArrayProxy from '../../lib/system/array_proxy'; +import EmberObject from '../../lib/system/object'; import { window } from 'ember-browser-environment'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; @@ -32,6 +33,19 @@ moduleFor( assert.equal(isArray(arrayProxy), true, '[]'); } + '@test Ember.isArray does not trigger proxy assertion when probing for length GH#16495'( + assert + ) { + let instance = EmberObject.extend({ + // intentionally returning non-null / non-undefined + unknownProperty() { + return false; + }, + }).create(); + + assert.equal(isArray(instance), false); + } + ['@test Ember.isArray(fileList)'](assert) { if (window && typeof window.FileList === 'function') { let fileListElement = document.createElement('input');