From 041ee8b4432c373bd11e920b5e8d80361458d579 Mon Sep 17 00:00:00 2001 From: bekzod Date: Wed, 6 Feb 2019 20:36:07 +0500 Subject: [PATCH] [BUGFIX] don't alter queryParam argument in RouterService#isActive --- .../-internals/routing/lib/services/router.ts | 3 +++ .../router_service_test/isActive_test.js | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/packages/@ember/-internals/routing/lib/services/router.ts b/packages/@ember/-internals/routing/lib/services/router.ts index 8f45696391c..7b9617d6819 100644 --- a/packages/@ember/-internals/routing/lib/services/router.ts +++ b/packages/@ember/-internals/routing/lib/services/router.ts @@ -2,6 +2,7 @@ import { Evented } from '@ember/-internals/runtime'; import { EMBER_ROUTING_ROUTER_SERVICE } from '@ember/canary-features'; import { assert } from '@ember/debug'; import { readOnly } from '@ember/object/computed'; +import { assign } from '@ember/polyfills'; import Service from '@ember/service'; import { DEBUG } from '@glimmer/env'; import { Transition } from 'router_js'; @@ -148,12 +149,14 @@ export default class RouterService extends Service { let hasQueryParams = Object.keys(queryParams).length > 0; if (hasQueryParams) { + queryParams = assign({}, queryParams); this._router._prepareQueryParams( routeName, models, queryParams, true /* fromRouterService */ ); + return shallowEqual(queryParams, routerMicrolib.state!.queryParams); } 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 0fec62fcaa2..c43925fca19 100644 --- a/packages/ember/tests/routing/router_service_test/isActive_test.js +++ b/packages/ember/tests/routing/router_service_test/isActive_test.js @@ -105,5 +105,30 @@ moduleFor( ); }); } + + ['@test RouterService#isActive does not alter query params hash'](assert) { + assert.expect(2); + + this.add( + 'controller:parent.child', + Controller.extend({ + queryParams: ['sort', 'page'], + sort: 'ASC', + page: 1, + }) + ); + + let qp = this.buildQueryParams({ sort: 'ascending' }); + + return this.visit('/') + .then(() => { + return this.routerService.transitionTo('parent.child', qp); + }) + .then(() => { + assert.ok(this.routerService.isActive('parent.child', qp)); + assert.ok(this.routerService.isActive('parent.child', qp)); // using same qp second time should not fail + assert.deepEqual(qp.queryParams, { sort: 'ascending' }); + }); + } } );