From e751cb0090aa7eae96ca92bbd43ded745fc040d6 Mon Sep 17 00:00:00 2001 From: Thomas Wang Date: Tue, 29 Dec 2020 11:42:39 -0800 Subject: [PATCH 1/4] Lazily setup the router in non-application tests for component PR #19080 fixed the issue where accessing public router service throwing error, however, the PR did not support LinkTo component which uses the internal -routing service. This PR adds similar lazy setup to -routing.router. --- .../components/link-to/rendering-angle-test.js | 9 +++++++-- .../-internals/routing/lib/services/routing.ts | 16 +++++++++++++++- packages/@ember/engine/index.js | 2 -- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js index 220c9eaed2f..99e4c072f7b 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js @@ -1,4 +1,9 @@ -import { moduleFor, ApplicationTestCase, RenderingTestCase, runTask } from 'internal-test-helpers'; +import { + moduleFor, + ApplicationTestCase, + RenderingTestCase, + runTask, +} from 'internal-test-helpers'; import Controller from '@ember/controller'; import { set } from '@ember/-internals/metal'; @@ -101,7 +106,7 @@ moduleFor( ['@test should be able to be inserted in DOM when the router is not present - block']() { this.render(`Go to Index`); - this.assertText('Go to Index'); + this.assertComponentElement(this.element.firstChild, { tagName: 'a', attrs: { href: '#/' }, content: 'Go to Index' }); } } ); diff --git a/packages/@ember/-internals/routing/lib/services/routing.ts b/packages/@ember/-internals/routing/lib/services/routing.ts index 8321daadbe4..457cf3c7f03 100644 --- a/packages/@ember/-internals/routing/lib/services/routing.ts +++ b/packages/@ember/-internals/routing/lib/services/routing.ts @@ -2,12 +2,16 @@ @module ember */ +import { getOwner, Owner } from '@ember/-internals/owner'; import { readOnly } from '@ember/object/computed'; import { assign } from '@ember/polyfills'; import Service from '@ember/service'; +import { symbol } from '@ember/-internals/utils'; import EmberRouter, { QueryParam } from '../system/router'; import RouterState from '../system/router_state'; +const ROUTER = symbol('ROUTER') as string; + /** The Routing service is used by LinkComponent, and provides facilities for the component/view layer to interact with the router. @@ -19,7 +23,17 @@ import RouterState from '../system/router_state'; @class RoutingService */ export default class RoutingService extends Service { - router!: EmberRouter; + get router(): EmberRouter { + let router = this[ROUTER]; + if (router !== undefined) { + return router; + } + const owner = getOwner(this) as Owner; + router = owner.lookup('router:main') as EmberRouter; + router.setupRouter(); + return (this[ROUTER] = router); + } + hasRoute(routeName: string) { return this.router.hasRoute(routeName); } diff --git a/packages/@ember/engine/index.js b/packages/@ember/engine/index.js index 62844532a9e..0ab30e9b50e 100644 --- a/packages/@ember/engine/index.js +++ b/packages/@ember/engine/index.js @@ -511,8 +511,6 @@ function commonSetupRegistry(registry) { // Register the routing service... registry.register('service:-routing', RoutingService); - // Then inject the app router into it - registry.injection('service:-routing', 'router', 'router:main'); // DEBUGGING registry.register('resolver-for-debugging:main', registry.resolver, { From 52e62350d46e852f85c2eadf15069d54a7bd70eb Mon Sep 17 00:00:00 2001 From: Thomas Wang Date: Tue, 29 Dec 2020 11:50:48 -0800 Subject: [PATCH 2/4] fix linting --- .../components/link-to/rendering-angle-test.js | 13 ++++++------- .../-internals/routing/lib/services/routing.ts | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js index 99e4c072f7b..fd6aa02f5bc 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js @@ -1,9 +1,4 @@ -import { - moduleFor, - ApplicationTestCase, - RenderingTestCase, - runTask, -} from 'internal-test-helpers'; +import { moduleFor, ApplicationTestCase, RenderingTestCase, runTask } from 'internal-test-helpers'; import Controller from '@ember/controller'; import { set } from '@ember/-internals/metal'; @@ -106,7 +101,11 @@ moduleFor( ['@test should be able to be inserted in DOM when the router is not present - block']() { this.render(`Go to Index`); - this.assertComponentElement(this.element.firstChild, { tagName: 'a', attrs: { href: '#/' }, content: 'Go to Index' }); + this.assertComponentElement(this.element.firstChild, { + tagName: 'a', + attrs: { href: '#/' }, + content: 'Go to Index', + }); } } ); diff --git a/packages/@ember/-internals/routing/lib/services/routing.ts b/packages/@ember/-internals/routing/lib/services/routing.ts index 457cf3c7f03..d459c07bacd 100644 --- a/packages/@ember/-internals/routing/lib/services/routing.ts +++ b/packages/@ember/-internals/routing/lib/services/routing.ts @@ -3,10 +3,10 @@ */ import { getOwner, Owner } from '@ember/-internals/owner'; +import { symbol } from '@ember/-internals/utils'; import { readOnly } from '@ember/object/computed'; import { assign } from '@ember/polyfills'; import Service from '@ember/service'; -import { symbol } from '@ember/-internals/utils'; import EmberRouter, { QueryParam } from '../system/router'; import RouterState from '../system/router_state'; From 763e756362c7cdc48d6bd91b0ef4920af225a93e Mon Sep 17 00:00:00 2001 From: Thomas Wang Date: Tue, 29 Dec 2020 12:13:25 -0800 Subject: [PATCH 3/4] fix injection test --- packages/@ember/application/tests/application_test.js | 1 - packages/@ember/engine/tests/engine_test.js | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/@ember/application/tests/application_test.js b/packages/@ember/application/tests/application_test.js index 9b2601e4664..2bce001fcba 100644 --- a/packages/@ember/application/tests/application_test.js +++ b/packages/@ember/application/tests/application_test.js @@ -156,7 +156,6 @@ moduleFor( verifyRegistration(assert, application, 'component:textarea'); verifyRegistration(assert, application, 'service:-routing'); - verifyInjection(assert, application, 'service:-routing', 'router', 'router:main'); // DEBUGGING verifyRegistration(assert, application, 'resolver-for-debugging:main'); diff --git a/packages/@ember/engine/tests/engine_test.js b/packages/@ember/engine/tests/engine_test.js index 428ea1f0d87..018b342a4e8 100644 --- a/packages/@ember/engine/tests/engine_test.js +++ b/packages/@ember/engine/tests/engine_test.js @@ -81,7 +81,6 @@ moduleFor( verifyRegistration(assert, engine, 'component:textarea'); verifyRegistration(assert, engine, 'service:-routing'); - verifyInjection(assert, engine, 'service:-routing', 'router', 'router:main'); // DEBUGGING verifyRegistration(assert, engine, 'resolver-for-debugging:main'); From a2dbcd444d6cf55353fbfe161fa301d7e6a1a1b9 Mon Sep 17 00:00:00 2001 From: Thomas Wang Date: Tue, 29 Dec 2020 15:01:00 -0800 Subject: [PATCH 4/4] fix async get handler test --- .../query_param_async_get_handler_test.js | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/packages/ember/tests/routing/query_params_test/query_param_async_get_handler_test.js b/packages/ember/tests/routing/query_params_test/query_param_async_get_handler_test.js index b2f64ec5ee6..629cb4777b5 100644 --- a/packages/ember/tests/routing/query_params_test/query_param_async_get_handler_test.js +++ b/packages/ember/tests/routing/query_params_test/query_param_async_get_handler_test.js @@ -21,28 +21,31 @@ moduleFor( }, setupRouter() { - this._super(...arguments); - let { _handlerPromises: handlerPromises, _seenHandlers: seenHandlers } = this; - let getRoute = this._routerMicrolib.getRoute; - - this._routerMicrolib.getRoute = function (routeName) { - fetchedHandlers.push(routeName); - - // Cache the returns so we don't have more than one Promise for a - // given handler. - return ( - handlerPromises[routeName] || - (handlerPromises[routeName] = new RSVP.Promise((resolve) => { - setTimeout(() => { - let handler = getRoute(routeName); - - seenHandlers[routeName] = handler; - - resolve(handler); - }, 10); - })) - ); - }; + let isNewSetup = this._super(...arguments); + if (isNewSetup) { + let { _handlerPromises: handlerPromises, _seenHandlers: seenHandlers } = this; + let getRoute = this._routerMicrolib.getRoute; + + this._routerMicrolib.getRoute = function (routeName) { + fetchedHandlers.push(routeName); + + // Cache the returns so we don't have more than one Promise for a + // given handler. + return ( + handlerPromises[routeName] || + (handlerPromises[routeName] = new RSVP.Promise((resolve) => { + setTimeout(() => { + let handler = getRoute(routeName); + + seenHandlers[routeName] = handler; + + resolve(handler); + }, 10); + })) + ); + }; + } + return isNewSetup; }, _getQPMeta(routeInfo) {