diff --git a/packages/ember-glimmer/lib/utils/references.js b/packages/ember-glimmer/lib/utils/references.js index d318135fc94..76f2d75a07a 100644 --- a/packages/ember-glimmer/lib/utils/references.js +++ b/packages/ember-glimmer/lib/utils/references.js @@ -1,4 +1,8 @@ -import { symbol, EmptyObject } from 'ember-utils'; +import { + HAS_NATIVE_WEAKMAP, + symbol, + EmptyObject +} from 'ember-utils'; import { get, set, @@ -289,8 +293,10 @@ export class SimpleHelperReference extends CachedReference { let namedValue = named.value(); runInDebug(() => { - Object.freeze(positionalValue); - Object.freeze(namedValue); + if (HAS_NATIVE_WEAKMAP) { + Object.freeze(positionalValue); + Object.freeze(namedValue); + } }); let result = helper(positionalValue, namedValue); @@ -324,8 +330,10 @@ export class SimpleHelperReference extends CachedReference { let namedValue = named.value(); runInDebug(() => { - Object.freeze(positionalValue); - Object.freeze(namedValue); + if (HAS_NATIVE_WEAKMAP) { + Object.freeze(positionalValue); + Object.freeze(namedValue); + } }); return helper(positionalValue, namedValue); @@ -354,8 +362,10 @@ export class ClassBasedHelperReference extends CachedReference { let namedValue = named.value(); runInDebug(() => { - Object.freeze(positionalValue); - Object.freeze(namedValue); + if (HAS_NATIVE_WEAKMAP) { + Object.freeze(positionalValue); + Object.freeze(namedValue); + } }); return instance.compute(positionalValue, namedValue); diff --git a/packages/ember-glimmer/tests/integration/helpers/custom-helper-test.js b/packages/ember-glimmer/tests/integration/helpers/custom-helper-test.js index e8b21735f87..a4c2119ea07 100644 --- a/packages/ember-glimmer/tests/integration/helpers/custom-helper-test.js +++ b/packages/ember-glimmer/tests/integration/helpers/custom-helper-test.js @@ -3,6 +3,7 @@ import { RenderingTest, moduleFor } from '../../utils/test-case'; import { makeBoundHelper } from '../../utils/helpers'; import { runDestroy } from 'internal-test-helpers'; import { set } from 'ember-metal'; +import { HAS_NATIVE_WEAKMAP } from 'ember-utils'; let assert = QUnit.assert; @@ -174,6 +175,30 @@ moduleFor('Helpers test: custom helpers', class extends RenderingTest { assert.strictEqual(destroyCount, 0, 'destroy is not called on recomputation'); } + ['@test helper params can be returned']() { + this.registerHelper('hello-world', values => { + return values; + }); + + this.render('{{#each (hello-world model) as |item|}}({{item}}){{/each}}', { + model: ['bob'] + }); + + this.assertText('(bob)'); + } + + ['@test helper hash can be returned']() { + this.registerHelper('hello-world', (_, hash) => { + return hash.model; + }); + + this.render(`{{get (hello-world model=model) 'name'}}`, { + model: { name: 'bob' } + }); + + this.assertText('bob'); + } + ['@test simple helper is called for param changes']() { let computeCount = 0; @@ -602,7 +627,7 @@ let addingPropertyToFrozenObjectThrows = (() => { } })(); -if (!EmberDev.runningProdBuild && ( +if (!EmberDev.runningProdBuild && HAS_NATIVE_WEAKMAP && ( pushingIntoFrozenArrayThrows || assigningExistingFrozenPropertyThrows || addingPropertyToFrozenObjectThrows diff --git a/packages/ember-metal/lib/meta.js b/packages/ember-metal/lib/meta.js index f76ecdbcfd8..40d9e9fbac8 100644 --- a/packages/ember-metal/lib/meta.js +++ b/packages/ember-metal/lib/meta.js @@ -2,7 +2,12 @@ // Remove "use strict"; from transpiled module until // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed -import { EmptyObject, lookupDescriptor, symbol } from 'ember-utils'; +import { + HAS_NATIVE_WEAKMAP, + EmptyObject, + lookupDescriptor, + symbol +} from 'ember-utils'; import isEnabled from './features'; import { protoMethods as listenerMethods } from './meta_listeners'; import { runInDebug, assert } from './debug'; @@ -460,17 +465,6 @@ if (isEnabled('mandatory-setter')) { }; } -const HAS_NATIVE_WEAKMAP = (function() { - // detect if `WeakMap` is even present - let hasWeakMap = typeof WeakMap === 'function'; - if (!hasWeakMap) { return false; } - - let instance = new WeakMap(); - // use `Object`'s `.toString` directly to prevent us from detecting - // polyfills as native weakmaps - return Object.prototype.toString.call(instance) === '[object WeakMap]'; -})(); - let setMeta, peekMeta; // choose the one appropriate for given platform diff --git a/packages/ember-utils/lib/index.js b/packages/ember-utils/lib/index.js index 526380b9420..4c3e392de20 100644 --- a/packages/ember-utils/lib/index.js +++ b/packages/ember-utils/lib/index.js @@ -30,3 +30,4 @@ export { default as makeArray } from './make-array'; export { default as applyStr } from './apply-str'; export { default as NAME_KEY } from './name'; export { default as toString } from './to-string'; +export { HAS_NATIVE_WEAKMAP } from './weak-map-utils'; diff --git a/packages/ember-utils/lib/weak-map-utils.js b/packages/ember-utils/lib/weak-map-utils.js new file mode 100644 index 00000000000..b316fa569bc --- /dev/null +++ b/packages/ember-utils/lib/weak-map-utils.js @@ -0,0 +1,10 @@ +export const HAS_NATIVE_WEAKMAP = (function() { + // detect if `WeakMap` is even present + let hasWeakMap = typeof WeakMap === 'function'; + if (!hasWeakMap) { return false; } + + let instance = new WeakMap(); + // use `Object`'s `.toString` directly to prevent us from detecting + // polyfills as native weakmaps + return Object.prototype.toString.call(instance) === '[object WeakMap]'; +})();