diff --git a/packages/@ember/-internals/environment/lib/env.ts b/packages/@ember/-internals/environment/lib/env.ts
index 93f3d1ac326..f8b196b7aad 100644
--- a/packages/@ember/-internals/environment/lib/env.ts
+++ b/packages/@ember/-internals/environment/lib/env.ts
@@ -155,23 +155,6 @@ export const ENV = {
*/
_RERENDER_LOOP_LIMIT: 1000,
- /**
- Allows disabling the implicit this property fallback deprecation. This could be useful
- as a way to control the volume of deprecations that are issued by temporarily disabling
- the implicit this fallback deprecations, which would allow the other deprecations to be more easily
- identified in the console).
-
- NOTE: The fallback behavior **will be removed** in Ember 4.0.0, disabling **_IS NOT_**
- a viable strategy for handling this deprecation.
-
- @property _DISABLE_PROPERTY_FALLBACK_DEPRECATION
- @for EmberENV
- @type boolean
- @default false
- @private
- */
- _DISABLE_PROPERTY_FALLBACK_DEPRECATION: false,
-
EMBER_LOAD_HOOKS: {} as {
[hook: string]: Function[];
},
diff --git a/packages/@ember/-internals/glimmer/lib/environment.ts b/packages/@ember/-internals/glimmer/lib/environment.ts
index 12a91fcb41d..3e6cafbde2a 100644
--- a/packages/@ember/-internals/glimmer/lib/environment.ts
+++ b/packages/@ember/-internals/glimmer/lib/environment.ts
@@ -106,16 +106,6 @@ const VM_DEPRECATION_OVERRIDES: (DeprecationOptions & {
enabled: '3.21.0',
},
},
- {
- id: 'this-property-fallback',
- disabled: ENV._DISABLE_PROPERTY_FALLBACK_DEPRECATION,
- url: 'https://deprecations.emberjs.com/v3.x#toc_this-property-fallback',
- until: '4.0.0',
- for: 'ember-source',
- since: {
- enabled: '3.26.0',
- },
- },
{
id: 'argument-less-helper-paren-less-invocation',
url: 'https://deprecations.emberjs.com/v3.x#toc_argument-less-helper-paren-less-invocation',
diff --git a/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js b/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js
index 71bc1b74107..d4d1b8b48ea 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js
@@ -178,7 +178,7 @@ moduleFor(
}
['@test sharing a template between engine and application has separate refinements']() {
- this.assert.expect(2);
+ this.assert.expect(1);
let sharedTemplate = compile(strip`
{{this.contextType}}
@@ -187,10 +187,6 @@ moduleFor(
{{outlet}}
`);
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.add('template:application', sharedTemplate);
this.add(
'controller:application',
@@ -238,10 +234,6 @@ moduleFor(
['@test sharing a layout between engine and application has separate refinements']() {
this.assert.expect(2);
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
let sharedLayout = compile(strip`
{{ambiguous-curlies}}
`);
diff --git a/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js b/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js
index ba43210274c..2eee0f6cf63 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js
@@ -105,47 +105,7 @@ moduleFor(
});
}
- ['@test it can access the model provided by the route via implicit this fallback']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
- this.add(
- 'route:application',
- Route.extend({
- model() {
- return ['red', 'yellow', 'blue'];
- },
- })
- );
-
- this.addTemplate(
- 'application',
- strip`
-
- {{#each model as |item|}}
- - {{item}}
- {{/each}}
-
- `
- );
-
- return this.visit('/').then(() => {
- this.assertInnerHTML(strip`
-
- `);
- });
- }
-
async ['@test interior mutations on the model with set'](assert) {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.router.map(function () {
this.route('color', { path: '/:color' });
});
@@ -164,7 +124,7 @@ moduleFor(
strip`
[@model: {{@model.color}}]
[this.model: {{this.model.color}}]
- [model: {{model.color}}]
+ [model: {{this.model.color}}]
`
);
@@ -203,10 +163,6 @@ moduleFor(
}
async ['@test interior mutations on the model with tracked properties'](assert) {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
class Model {
@tracked color;
@@ -233,7 +189,7 @@ moduleFor(
strip`
[@model: {{@model.color}}]
[this.model: {{this.model.color}}]
- [model: {{model.color}}]
+ [model: {{this.model.color}}]
`
);
@@ -271,10 +227,6 @@ moduleFor(
}
async ['@test exterior mutations on the model with set'](assert) {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.router.map(function () {
this.route('color', { path: '/:color' });
});
@@ -293,7 +245,7 @@ moduleFor(
strip`
[@model: {{@model}}]
[this.model: {{this.model}}]
- [model: {{model}}]
+ [model: {{this.model}}]
`
);
@@ -332,10 +284,6 @@ moduleFor(
}
async ['@test exterior mutations on the model with tracked properties'](assert) {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.router.map(function () {
this.route('color', { path: '/:color' });
});
@@ -361,7 +309,7 @@ moduleFor(
strip`
[@model: {{@model}}]
[this.model: {{this.model}}]
- [model: {{model}}]
+ [model: {{this.model}}]
`
);
diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js
index 5fdd2305aff..84c620de3fa 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js
@@ -3515,24 +3515,6 @@ moduleFor(
this.assertComponentElement(this.firstChild, { content: 'hello' });
}
- ['@test can use `{{component.foo}}` in a template GH#19313']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
- this.registerComponent('foo-bar', {
- template: '{{component.foo}}',
- });
-
- this.render('{{foo-bar component=(hash foo="bar")}}');
-
- this.assertComponentElement(this.firstChild, { content: 'bar' });
-
- runTask(() => this.rerender());
-
- this.assertComponentElement(this.firstChild, { content: 'bar' });
- }
-
['@test can use `{{@component.foo}}` in a template GH#19313']() {
this.registerComponent('foo-bar', {
template: '{{@component.foo}}',
diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js
index 22896382648..033188083ac 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js
@@ -197,11 +197,7 @@ if (ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) {
}
['@test it renders named arguments as reflected properties']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
- this.registerTemplateOnlyComponent('foo-bar', '|{{foo}}|{{this.bar}}|');
+ this.registerTemplateOnlyComponent('foo-bar', '|{{this.foo}}|{{this.bar}}|');
this.render('{{foo-bar foo=this.foo bar=this.bar}}', {
foo: 'foo',
diff --git a/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js b/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js
index dcba0e131bf..c5634e8e258 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js
@@ -35,10 +35,6 @@ moduleFor(
}
['@test it does not resolve helpers with a `.` (period)']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.registerHelper('hello.world', () => 'hello world');
this.render('{{hello.world}}', {
diff --git a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js
index 2959fda9f77..0a13ec3b556 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js
@@ -725,34 +725,28 @@ class EachTest extends AbstractEachTest {
}
['@test the scoped variable is not available outside the {{#each}} block.']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.makeList(['Yehuda']);
- this.render(`{{name}}-{{#each this.list as |name|}}{{name}}{{/each}}-{{name}}`, {
- name: 'Stef',
- });
+ this.render(`{{name}}-{{#each this.list as |name|}}{{name}}{{/each}}-{{name}}`);
- this.assertText('Stef-Yehuda-Stef');
+ this.assertText('-Yehuda-Stef');
runTask(() => this.rerender());
- this.assertText('Stef-Yehuda-Stef');
+ this.assertText('-Yehuda-');
runTask(() => this.pushObjects([' ', 'Katz']));
- this.assertText('Stef-Yehuda Katz-Stef');
+ this.assertText('-Yehuda Katz-');
runTask(() => set(this.context, 'name', 'Tom'));
- this.assertText('Tom-Yehuda Katz-Tom');
+ this.assertText('-Yehuda Katz-');
runTask(() => set(this.context, 'name', 'Stef'));
this.replaceList(['Yehuda']);
- this.assertText('Stef-Yehuda-Stef');
+ this.assertText('-Yehuda-');
}
['@test inverse template is displayed with context']() {
@@ -946,10 +940,6 @@ class EachTest extends AbstractEachTest {
}
['@test the scoped variable is not available outside the {{#each}} block']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
let first = this.createList(['Limbo']);
let fifth = this.createList(['Wrath']);
let ninth = this.createList(['Treachery']);
@@ -957,41 +947,38 @@ class EachTest extends AbstractEachTest {
this.render(
`{{ring}}-{{#each this.first as |ring|}}{{ring}}-{{#each this.fifth as |ring|}}{{ring}}-{{#each this.ninth as |ring|}}{{ring}}-{{/each}}{{ring}}-{{/each}}{{ring}}-{{/each}}{{ring}}`,
{
- ring: 'Greed',
first: first.list,
fifth: fifth.list,
ninth: ninth.list,
}
);
- this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');
+ this.assertText('-Limbo-Wrath-Treachery-Wrath-Limbo-');
runTask(() => this.rerender());
- this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');
+ this.assertText('-Limbo-Wrath-Treachery-Wrath-Limbo-');
runTask(() => {
- set(this.context, 'ring', 'O');
fifth.delegate.insertAt(0, 'D');
});
- this.assertText('O-Limbo-D-Treachery-D-Wrath-Treachery-Wrath-Limbo-O');
+ this.assertText('-Limbo-D-Treachery-D-Wrath-Treachery-Wrath-Limbo-');
runTask(() => {
first.delegate.pushObject('I');
ninth.delegate.replace(0, 1, ['K']);
});
- this.assertText('O-Limbo-D-K-D-Wrath-K-Wrath-Limbo-I-D-K-D-Wrath-K-Wrath-I-O');
+ this.assertText('-Limbo-D-K-D-Wrath-K-Wrath-Limbo-I-D-K-D-Wrath-K-Wrath-I-');
runTask(() => {
- set(this.context, 'ring', 'Greed');
set(this.context, 'first', this.createList(['Limbo']).list);
set(this.context, 'fifth', this.createList(['Wrath']).list);
set(this.context, 'ninth', this.createList(['Treachery']).list);
});
- this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');
+ this.assertText('-Limbo-Wrath-Treachery-Wrath-Limbo-');
}
['@test it should support {{#each this.name as |foo|}}, then {{#each foo as |bar|}}']() {
diff --git a/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js b/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js
index a08c411f2a9..f7cb1ee8049 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js
@@ -96,35 +96,29 @@ moduleFor(
}
['@test the scoped variable is not available outside the {{#let}} block.']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.render(`{{name}}-{{#let this.other as |name|}}{{name}}{{/let}}-{{name}}`, {
- name: 'Stef',
other: 'Yehuda',
});
- this.assertText('Stef-Yehuda-Stef');
+ this.assertText('-Yehuda-');
runTask(() => this.rerender());
- this.assertText('Stef-Yehuda-Stef');
+ this.assertText('-Yehuda-');
runTask(() => set(this.context, 'other', 'Chad'));
- this.assertText('Stef-Chad-Stef');
+ this.assertText('-Chad-');
runTask(() => set(this.context, 'name', 'Tom'));
- this.assertText('Tom-Chad-Tom');
+ this.assertText('-Chad-');
runTask(() => {
- set(this.context, 'name', 'Stef');
set(this.context, 'other', 'Yehuda');
});
- this.assertText('Stef-Yehuda-Stef');
+ this.assertText('-Yehuda-');
}
['@test can access alias of a proxy']() {
@@ -246,48 +240,41 @@ moduleFor(
}
['@test the scoped variable is not available outside the {{#let}} block']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.render(
`{{ring}}-{{#let this.first as |ring|}}{{ring}}-{{#let this.fifth as |ring|}}{{ring}}-{{#let this.ninth as |ring|}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}`,
{
- ring: 'Greed',
first: 'Limbo',
fifth: 'Wrath',
ninth: 'Treachery',
}
);
- this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');
+ this.assertText('-Limbo-Wrath-Treachery-Wrath-Limbo-');
runTask(() => this.rerender());
- this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');
+ this.assertText('-Limbo-Wrath-Treachery-Wrath-Limbo-');
runTask(() => {
- set(this.context, 'ring', 'O');
set(this.context, 'fifth', 'D');
});
- this.assertText('O-Limbo-D-Treachery-D-Limbo-O');
+ this.assertText('-Limbo-D-Treachery-D-Limbo-');
runTask(() => {
set(this.context, 'first', 'I');
set(this.context, 'ninth', 'K');
});
- this.assertText('O-I-D-K-D-I-O');
+ this.assertText('-I-D-K-D-I-');
runTask(() => {
- set(this.context, 'ring', 'Greed');
set(this.context, 'first', 'Limbo');
set(this.context, 'fifth', 'Wrath');
set(this.context, 'ninth', 'Treachery');
});
- this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');
+ this.assertText('-Limbo-Wrath-Treachery-Wrath-Limbo-');
}
['@test it should support {{#let name as |foo|}}, then {{#let foo as |bar|}}']() {
@@ -331,10 +318,6 @@ moduleFor(
}
['@test nested {{#let}} blocks should have access to root context']() {
- expectDeprecation(
- /The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/
- );
-
this.render(
strip`
{{name}}
diff --git a/tests/docs/expected.js b/tests/docs/expected.js
index 3b98b3f264d..b97f44edb28 100644
--- a/tests/docs/expected.js
+++ b/tests/docs/expected.js
@@ -9,7 +9,6 @@ module.exports = {
'LOG_VERSION',
'[]',
'_APPLICATION_TEMPLATE_WRAPPER',
- '_DISABLE_PROPERTY_FALLBACK_DEPRECATION',
'_DEBUG_RENDER_TREE',
'_DEFAULT_ASYNC_OBSERVERS',
'_RERENDER_LOOP_LIMIT',