From adbffdbcc59d2216b821aa085d9b2974fc534954 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 28 Feb 2019 19:12:28 -0500 Subject: [PATCH] [BUGFIX lts] Enable maximum rerendering limit to be customized. As of Ember 3.4 the autorun assertion is removed, and usage of native promises has increase the likely hood that this rerender limit of 10 will be hit in "normal" scenarios. Co-authored-by: Kris Selden --- packages/@ember/-internals/environment/lib/env.ts | 13 +++++++++++++ packages/@ember/-internals/glimmer/lib/renderer.ts | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/@ember/-internals/environment/lib/env.ts b/packages/@ember/-internals/environment/lib/env.ts index e6d907a62ff..7e42a6f04ef 100644 --- a/packages/@ember/-internals/environment/lib/env.ts +++ b/packages/@ember/-internals/environment/lib/env.ts @@ -111,6 +111,19 @@ export const ENV = { */ _JQUERY_INTEGRATION: true, + /** + Controls the maximum number of scheduled rerenders without "settling". In general, + applications should not need to modify this environment variable, but please + open an issue so that we can determine if a better default value is needed. + + @property _RERENDER_LOOP_LIMIT + @for EmberENV + @type number + @default 1000 + @private + */ + _RERENDER_LOOP_LIMIT: 1000, + EMBER_LOAD_HOOKS: {} as { [hook: string]: Function[]; }, diff --git a/packages/@ember/-internals/glimmer/lib/renderer.ts b/packages/@ember/-internals/glimmer/lib/renderer.ts index 50d2ee1c45a..0a91acfd7c3 100644 --- a/packages/@ember/-internals/glimmer/lib/renderer.ts +++ b/packages/@ember/-internals/glimmer/lib/renderer.ts @@ -1,3 +1,4 @@ +import { ENV } from '@ember/-internals/environment'; import { runInTransaction, setHasViews } from '@ember/-internals/metal'; import { fallbackViewRegistry, @@ -229,7 +230,7 @@ let loops = 0; function loopEnd() { for (let i = 0; i < renderers.length; i++) { if (!renderers[i]._isValid()) { - if (loops > 10) { + if (loops > ENV._RERENDER_LOOP_LIMIT) { loops = 0; // TODO: do something better renderers[i].destroy();