From 1d4a56477330421cb61856873f3746059f97c566 Mon Sep 17 00:00:00 2001 From: chandra mouli <36290709+moulichan99@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:45:48 +0530 Subject: [PATCH 1/4] Added setupRouter before which initializes _routerMicrolib. --- packages/@ember/routing/router-service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@ember/routing/router-service.ts b/packages/@ember/routing/router-service.ts index f99166ae6b7..936e7539d1c 100644 --- a/packages/@ember/routing/router-service.ts +++ b/packages/@ember/routing/router-service.ts @@ -311,6 +311,7 @@ class RouterService extends Service.extend(Evented) { */ isActive(...args: RouteArgs) { let { routeName, models, queryParams } = extractRouteArgs(args); + this._router.setupRouter(); let routerMicrolib = this._router._routerMicrolib; // When using isActive() in a getter, we want to entagle with the auto-tracking system From f7cc45fe3cb3574fa9d051c66dc298a6f16c47d1 Mon Sep 17 00:00:00 2001 From: chandra mouli <36290709+moulichan99@users.noreply.github.com> Date: Sat, 2 Aug 2025 21:08:30 +0530 Subject: [PATCH 2/4] test case --- .../router_service_test/isActive_test.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/ember/tests/routing/router_service_test/isActive_test.js b/packages/ember/tests/routing/router_service_test/isActive_test.js index 4a4f45ad4d7..9a0e0d4bab1 100644 --- a/packages/ember/tests/routing/router_service_test/isActive_test.js +++ b/packages/ember/tests/routing/router_service_test/isActive_test.js @@ -168,5 +168,23 @@ moduleFor( assert.deepEqual(qp.queryParams, { sort: 'ascending' }); }); } + + ['@test RouterService#isActive calls setupRouter to ensure router is initialized'](assert) { + assert.expect(1); + + return this.visit('/').then(() => { + let setupRouterCallCount = 0; + let originalSetupRouter = this.routerService._router.setupRouter; + + this.routerService._router.setupRouter = function () { + setupRouterCallCount++; + return originalSetupRouter.call(this); + }; + + this.routerService.isActive('parent.child'); + + assert.equal(setupRouterCallCount, 1, 'setupRouter should be called exactly once when isActive is invoked'); + }); + } } ); From 0e5c2a42f2bf412b27c3769c72cf5c0f3d3dfd12 Mon Sep 17 00:00:00 2001 From: chandra mouli <36290709+moulichan99@users.noreply.github.com> Date: Wed, 6 Aug 2025 10:00:38 +0530 Subject: [PATCH 3/4] test case updated --- .../router_service_test/isActive_test.js | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/packages/ember/tests/routing/router_service_test/isActive_test.js b/packages/ember/tests/routing/router_service_test/isActive_test.js index 9a0e0d4bab1..5da9a3dd36d 100644 --- a/packages/ember/tests/routing/router_service_test/isActive_test.js +++ b/packages/ember/tests/routing/router_service_test/isActive_test.js @@ -169,21 +169,40 @@ moduleFor( }); } - ['@test RouterService#isActive calls setupRouter to ensure router is initialized'](assert) { + ['@test RouterService#isActive works reliably during component rendering before router initialization'](assert) { assert.expect(1); + + // This simulates the scenario where isActive is called during component rendering + // before the router has been fully set up, which used to throw an error - return this.visit('/').then(() => { - let setupRouterCallCount = 0; - let originalSetupRouter = this.routerService._router.setupRouter; + let componentInstance; + + this.addTemplate('parent.index', '{{foo-component}}'); - this.routerService._router.setupRouter = function () { - setupRouterCallCount++; - return originalSetupRouter.call(this); - }; + this.addComponent('foo-component', { + ComponentClass: class extends Component { + @service('router') + routerService; + + init() { + super.init(); + componentInstance = this; + } - this.routerService.isActive('parent.child'); + get isRouteActive() { + // This used to throw "Cannot read properties of undefined (reading 'isActiveIntent')" + // before setupRouter() was added to the isActive method + return this.routerService.isActive('parent.child'); + } + }, + template: `{{this.isRouteActive}}`, + }); - assert.equal(setupRouterCallCount, 1, 'setupRouter should be called exactly once when isActive is invoked'); + return this.visit('/').then(() => { + // The test passes if no error is thrown during rendering + // and isActive returns a boolean value + assert.strictEqual(typeof componentInstance.isRouteActive, 'boolean', + 'isActive should return a boolean value without throwing an error'); }); } } From ae92b61b963c3689763f26428ed2df79d2fd9c00 Mon Sep 17 00:00:00 2001 From: chandra mouli <36290709+moulichan99@users.noreply.github.com> Date: Wed, 6 Aug 2025 10:55:51 +0530 Subject: [PATCH 4/4] lint fix --- .../ember/tests/routing/router_service_test/isActive_test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ember/tests/routing/router_service_test/isActive_test.js b/packages/ember/tests/routing/router_service_test/isActive_test.js index 5da9a3dd36d..f06f5db7bdd 100644 --- a/packages/ember/tests/routing/router_service_test/isActive_test.js +++ b/packages/ember/tests/routing/router_service_test/isActive_test.js @@ -1,4 +1,5 @@ import Controller from '@ember/controller'; +import { Component } from '@ember/-internals/glimmer'; import { RouterTestCase, moduleFor } from 'internal-test-helpers'; import Service, { service } from '@ember/service';