Skip to content

Commit b7ea5ae

Browse files
author
Anass OUMIRI
authored
Merge pull request #234 from nickschot/render-assertion-fix
Fix rerender assertion when focussing certain Glimmer components
2 parents 9e7cc22 + d611316 commit b7ea5ae

File tree

4 files changed

+168
-7
lines changed

4 files changed

+168
-7
lines changed

addon/modifiers/autofocus.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { modifier } from 'ember-modifier';
2+
import { next } from '@ember/runloop';
23

34
const DEFAULT_SELECTOR = 'input:not([disabled]),textarea:not([disabled])';
45

@@ -13,9 +14,11 @@ export default modifier(function autofocus(
1314

1415
const childElement = element.querySelector(selector);
1516

16-
if (childElement) {
17-
childElement.focus();
18-
} else {
19-
element.focus();
20-
}
17+
next(function () {
18+
if (childElement) {
19+
childElement.focus();
20+
} else {
21+
element.focus();
22+
}
23+
});
2124
});

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
"@ember/optional-features": "^2.0.0",
4040
"@ember/test-helpers": "^2.4.2",
4141
"@embroider/test-setup": "^0.43.5",
42+
"@glimmer/component": "^1.0.4",
43+
"@glimmer/tracking": "^1.0.4",
4244
"babel-eslint": "^10.1.0",
4345
"broccoli-asset-rev": "^3.0.0",
4446
"ember-auto-import": "^2.2.3",
@@ -48,6 +50,8 @@
4850
"ember-cli-inject-live-reload": "^2.1.0",
4951
"ember-cli-sri": "^2.1.1",
5052
"ember-cli-terser": "^4.0.2",
53+
"ember-compatibility-helpers": "^1.2.5",
54+
"ember-decorators-polyfill": "^1.1.5",
5155
"ember-disable-prototype-extensions": "^1.1.3",
5256
"ember-export-application-global": "^2.0.0",
5357
"ember-load-initializers": "^2.1.2",

tests/integration/modifiers/autofocus-test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import { render } from '@ember/test-helpers';
22
import { setupRenderingTest } from 'ember-qunit';
33
import { module, test } from 'qunit';
4+
import { gte } from 'ember-compatibility-helpers';
5+
6+
import Component from '@glimmer/component';
7+
import { tracked } from '@glimmer/tracking';
8+
import { setComponentTemplate } from '@ember/component';
9+
import { action } from '@ember/object';
410

511
import hbs from 'htmlbars-inline-precompile';
612

@@ -198,4 +204,42 @@ module('Integration | Modifier | autofocus', function (hooks) {
198204
.dom('[data-test-input-3]')
199205
.isNotFocused('The third non related input are not focused');
200206
});
207+
208+
if (gte('3.16.0')) {
209+
test('should not cause rerender assertions on Glimmer components when a focus modifier is present', async function (assert) {
210+
class FooButtonComponent extends Component {
211+
@tracked bar;
212+
213+
@action
214+
updateBar() {
215+
this.bar = !this.bar;
216+
}
217+
}
218+
setComponentTemplate(
219+
hbs`
220+
<button
221+
{{on "focus" this.updateBar}}
222+
...attributes
223+
>
224+
Foo: {{this.bar}}
225+
</button>
226+
`,
227+
FooButtonComponent
228+
);
229+
this.owner.register('component:foo-button', FooButtonComponent);
230+
231+
await render(hbs`
232+
<div {{autofocus "input,button"}}>
233+
<span>this is not a focusable element</span>
234+
<FooButton data-test-foo/>
235+
<input data-test-input-1 />
236+
</div>
237+
`);
238+
239+
assert.dom('[data-test-foo]').isFocused('The button element is focused');
240+
assert
241+
.dom('[data-test-input-1]')
242+
.isNotFocused('The first non related input is not focused');
243+
});
244+
}
201245
});

yarn.lock

Lines changed: 112 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@
224224
"@babel/helper-replace-supers" "^7.13.12"
225225
"@babel/helper-split-export-declaration" "^7.12.13"
226226

227-
"@babel/helper-create-class-features-plugin@^7.16.0":
227+
"@babel/helper-create-class-features-plugin@^7.16.0", "@babel/helper-create-class-features-plugin@^7.5.5":
228228
version "7.16.0"
229229
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b"
230230
integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==
@@ -1822,6 +1822,15 @@
18221822
"@babel/helper-plugin-utils" "^7.0.0"
18231823
"@babel/plugin-syntax-typescript" "^7.2.0"
18241824

1825+
"@babel/plugin-transform-typescript@~7.5.0":
1826+
version "7.5.5"
1827+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8"
1828+
integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==
1829+
dependencies:
1830+
"@babel/helper-create-class-features-plugin" "^7.5.5"
1831+
"@babel/helper-plugin-utils" "^7.0.0"
1832+
"@babel/plugin-syntax-typescript" "^7.2.0"
1833+
18251834
"@babel/plugin-transform-typescript@~7.8.0":
18261835
version "7.8.7"
18271836
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda"
@@ -2404,6 +2413,31 @@
24042413
minimatch "^3.0.4"
24052414
strip-json-comments "^3.1.1"
24062415

2416+
"@glimmer/component@^1.0.4":
2417+
version "1.0.4"
2418+
resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-1.0.4.tgz#1c85a5181615a6647f6acfaaed68e28ad7e9626e"
2419+
integrity sha512-sS4N8wtcKfYdUJ6O3m8nbTut6NjErdz94Ap8VB1ekcg4WSD+7sI7Nmv6kt2rdPoe363nUdjUbRBzHNWhLzraBw==
2420+
dependencies:
2421+
"@glimmer/di" "^0.1.9"
2422+
"@glimmer/env" "^0.1.7"
2423+
"@glimmer/util" "^0.44.0"
2424+
broccoli-file-creator "^2.1.1"
2425+
broccoli-merge-trees "^3.0.2"
2426+
ember-cli-babel "^7.7.3"
2427+
ember-cli-get-component-path-option "^1.0.0"
2428+
ember-cli-is-package-missing "^1.0.0"
2429+
ember-cli-normalize-entity-name "^1.0.0"
2430+
ember-cli-path-utils "^1.0.0"
2431+
ember-cli-string-utils "^1.1.0"
2432+
ember-cli-typescript "3.0.0"
2433+
ember-cli-version-checker "^3.1.3"
2434+
ember-compatibility-helpers "^1.1.2"
2435+
2436+
"@glimmer/di@^0.1.9":
2437+
version "0.1.11"
2438+
resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.1.11.tgz#a6878c07a13a2c2c76fcde598a5c97637bfc4280"
2439+
integrity sha1-poeMB6E6LCx2/N5ZilyXY3v8QoA=
2440+
24072441
"@glimmer/encoder@^0.42.2":
24082442
version "0.42.2"
24092443
resolved "https://registry.yarnpkg.com/@glimmer/encoder/-/encoder-0.42.2.tgz#d3ba3dc9f1d4fa582d1d18b63da100fc5c664057"
@@ -2501,6 +2535,14 @@
25012535
"@handlebars/parser" "^1.1.0"
25022536
simple-html-tokenizer "^0.5.10"
25032537

2538+
"@glimmer/tracking@^1.0.4":
2539+
version "1.0.4"
2540+
resolved "https://registry.yarnpkg.com/@glimmer/tracking/-/tracking-1.0.4.tgz#f1bc1412fe5e2236d0f8d502994a8f88af1bbb21"
2541+
integrity sha512-F+oT8I55ba2puSGIzInmVrv/8QA2PcK1VD+GWgFMhF6WC97D+uZX7BFg+a3s/2N4FVBq5KHE+QxZzgazM151Yw==
2542+
dependencies:
2543+
"@glimmer/env" "^0.1.7"
2544+
"@glimmer/validator" "^0.44.0"
2545+
25042546
"@glimmer/util@0.65.1":
25052547
version "0.65.1"
25062548
resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.65.1.tgz#c85ebc13344739c123e0ec6551ae740cf5fd62bf"
@@ -2515,6 +2557,11 @@
25152557
resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4"
25162558
integrity sha512-Heck0baFSaWDanCYtmOcLeaz7v+rSqI8ovS7twrp2/FWEteb3Ze5sWQ2BEuSAG23L/k/lzVwYM/MY7ZugxBpaA==
25172559

2560+
"@glimmer/util@^0.44.0":
2561+
version "0.44.0"
2562+
resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.44.0.tgz#45df98d73812440206ae7bda87cfe04aaae21ed9"
2563+
integrity sha512-duAsm30uVK9jSysElCbLyU6QQYO2X9iLDLBIBUcCqck9qN1o3tK2qWiHbGK5d6g8E2AJ4H88UrfElkyaJlGrwg==
2564+
25182565
"@glimmer/validator@0.65.1", "@glimmer/validator@^0.65.0":
25192566
version "0.65.1"
25202567
resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.65.1.tgz#07ebd13952660d341fea8e5b606b512fe1dbc176"
@@ -2523,6 +2570,11 @@
25232570
"@glimmer/env" "^0.1.7"
25242571
"@glimmer/global-context" "0.65.1"
25252572

2573+
"@glimmer/validator@^0.44.0":
2574+
version "0.44.0"
2575+
resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.44.0.tgz#03d127097dc9cb23052cdb7fcae59d0a9dca53e1"
2576+
integrity sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw==
2577+
25262578
"@glimmer/vm-babel-plugins@0.80.3":
25272579
version "0.80.3"
25282580
resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.80.3.tgz#434b62172318cac43830d3ac29818cf2c5f111c1"
@@ -6734,7 +6786,7 @@ ember-cli-babel@^6.0.0-beta.4:
67346786
ember-cli-version-checker "^2.1.2"
67356787
semver "^5.5.0"
67366788

6737-
ember-cli-babel@^7.0.0, ember-cli-babel@^7.10.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.6:
6789+
ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.10.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.6, ember-cli-babel@^7.7.3:
67386790
version "7.26.6"
67396791
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39"
67406792
integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ==
@@ -6871,6 +6923,23 @@ ember-cli-test-loader@^3.0.0:
68716923
dependencies:
68726924
ember-cli-babel "^7.13.2"
68736925

6926+
ember-cli-typescript@3.0.0:
6927+
version "3.0.0"
6928+
resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.0.0.tgz#3b838d1ce9e4d22a98e68da22ceac6dc0cfd9bfc"
6929+
integrity sha512-lo5YArbJzJi5ssvaGqTt6+FnhTALnSvYVuxM7lfyL1UCMudyNJ94ovH5C7n5il7ATd6WsNiAPRUO/v+s5Jq/aA==
6930+
dependencies:
6931+
"@babel/plugin-transform-typescript" "~7.5.0"
6932+
ansi-to-html "^0.6.6"
6933+
debug "^4.0.0"
6934+
ember-cli-babel-plugin-helpers "^1.0.0"
6935+
execa "^2.0.0"
6936+
fs-extra "^8.0.0"
6937+
resolve "^1.5.0"
6938+
rsvp "^4.8.1"
6939+
semver "^6.0.0"
6940+
stagehand "^1.0.0"
6941+
walk-sync "^2.0.0"
6942+
68746943
ember-cli-typescript@^2.0.2:
68756944
version "2.0.2"
68766945
resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.2.tgz#464984131fbdc05655eb61d1c3cdd911d3137f0d"
@@ -7040,6 +7109,16 @@ ember-cli@~3.28.4:
70407109
workerpool "^6.1.4"
70417110
yam "^1.0.0"
70427111

7112+
ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.5:
7113+
version "1.2.5"
7114+
resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.5.tgz#b8363b1d5b8725afa9a4fe2b2986ac28626c6f23"
7115+
integrity sha512-7cddkQQp8Rs2Mqrj0xqZ0uO7eC9tBCKyZNcP2iE1RxQqOGPv8fiPkj1TUeidUB/Qe80lstoVXWMEuqqhW7Yy9A==
7116+
dependencies:
7117+
babel-plugin-debug-macros "^0.2.0"
7118+
ember-cli-version-checker "^5.1.1"
7119+
fs-extra "^9.1.0"
7120+
semver "^5.4.1"
7121+
70437122
ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1, ember-compatibility-helpers@^1.2.4:
70447123
version "1.2.4"
70457124
resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.4.tgz#70e0fef7048969141626eed6006f3880df612cd1"
@@ -7050,6 +7129,15 @@ ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1, ember-co
70507129
fs-extra "^9.1.0"
70517130
semver "^5.4.1"
70527131

7132+
ember-decorators-polyfill@^1.1.5:
7133+
version "1.1.5"
7134+
resolved "https://registry.yarnpkg.com/ember-decorators-polyfill/-/ember-decorators-polyfill-1.1.5.tgz#49203c302ea4486618ba4866923ec657cf2c9f3d"
7135+
integrity sha512-O154i8sLoVjsiKzSqxGRfHGr+N+drT6mRrLDbNgJCnW/V5uLg/ppZFpUsrdxuXnp5Q9us3OfXV1nX2CH+7bUpA==
7136+
dependencies:
7137+
ember-cli-babel "^7.1.2"
7138+
ember-cli-version-checker "^3.1.3"
7139+
ember-compatibility-helpers "^1.2.0"
7140+
70537141
ember-destroyable-polyfill@^2.0.2:
70547142
version "2.0.2"
70557143
resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.2.tgz#2cc7532bd3c00e351b4da9b7fc683f4daff79671"
@@ -7800,6 +7888,21 @@ execa@^1.0.0:
78007888
signal-exit "^3.0.0"
78017889
strip-eof "^1.0.0"
78027890

7891+
execa@^2.0.0:
7892+
version "2.1.0"
7893+
resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99"
7894+
integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==
7895+
dependencies:
7896+
cross-spawn "^7.0.0"
7897+
get-stream "^5.0.0"
7898+
is-stream "^2.0.0"
7899+
merge-stream "^2.0.0"
7900+
npm-run-path "^3.0.0"
7901+
onetime "^5.1.0"
7902+
p-finally "^2.0.0"
7903+
signal-exit "^3.0.2"
7904+
strip-final-newline "^2.0.0"
7905+
78037906
execa@^3.0.0:
78047907
version "3.4.0"
78057908
resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
@@ -11284,6 +11387,13 @@ npm-run-path@^2.0.0:
1128411387
dependencies:
1128511388
path-key "^2.0.0"
1128611389

11390+
npm-run-path@^3.0.0:
11391+
version "3.1.0"
11392+
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5"
11393+
integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==
11394+
dependencies:
11395+
path-key "^3.0.0"
11396+
1128711397
npm-run-path@^4.0.0, npm-run-path@^4.0.1:
1128811398
version "4.0.1"
1128911399
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"

0 commit comments

Comments
 (0)