From 015cf03e62e370ec774e5d140a984e0e9d1aacc4 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 15 May 2017 15:39:45 -0400 Subject: [PATCH 1/3] [BUGFIX release] Ensure nested custom elements fallback properly. This fixes an issue with Ember versions using glimmer-vm@0.22 when attempting to use nested web components. This is obviously not correct for angle bracket components but since no consumers are currently using them with glimmer@0.22.x we are hard coding support to just use the fallback case. The master version of glimmer-vm (v0.23.0-alpha.x) properly handles this without issue (for either true angle bracket invocation or web component fallback invocation). diff --git a/packages/@glimmer/runtime/lib/syntax/functions.ts b/packages/@glimmer/runtime/lib/syntax/functions.ts index 3c9b3f2..29a2bba 100644 --- a/packages/@glimmer/runtime/lib/syntax/functions.ts +++ b/packages/@glimmer/runtime/lib/syntax/functions.ts @@ -196,6 +196,29 @@ STATEMENTS.add(Ops.ScannedBlock, (sexp: BaselineSyntax.ScannedBlock, builder) => blocks.compile([Ops.NestedBlock, path, params, hash, templateBlock, inverseBlock], builder); }); +// this fixes an issue with Ember versions using glimmer-vm@0.22 when attempting +// to use nested web components. This is obviously not correct for angle bracket components +// but since no consumers are currently using them with glimmer@0.22.x we are hard coding +// support to just use the fallback case. +STATEMENTS.add(Ops.Component, (sexp: WireFormat.Statements.Component, builder) => { + let [, tag, component ] = sexp; + let { attrs, statements } = component; + + builder.openPrimitiveElement(tag); + + for (let i = 0; i < attrs.length; i++) { + STATEMENTS.compile(attrs[i], builder); + } + + builder.flushElement(); + + for (let i = 0; i < statements.length; i++) { + STATEMENTS.compile(statements[i], builder); + } + + builder.closeElement(); +}); + STATEMENTS.add(Ops.ScannedComponent, (sexp: BaselineSyntax.ScannedComponent, builder) => { let [, tag, attrs, rawArgs, rawBlock] = sexp; let block = rawBlock && rawBlock.scan(); diff --git a/packages/@glimmer/runtime/tests/rendering/content-test.ts b/packages/@glimmer/runtime/tests/rendering/content-test.ts index c06ad9e..d39aaad 100644 --- a/packages/@glimmer/runtime/tests/rendering/content-test.ts +++ b/packages/@glimmer/runtime/tests/rendering/content-test.ts @@ -29,6 +29,19 @@ class StaticContentTests extends RenderingTest { this.assertStableRerender(); } + @template(`Stuff
Here
`) + ['renders nested custom elements']() { + this.render({}); + this.assertContent(`Stuff
Here
`); + this.assertStableRerender(); + } + @template(`Here`) + ['renders MOAR NESTED custom elements']() { + this.render({}); + this.assertContent(`Here`); + this.assertStableRerender(); + } + @template(strip`

Hello World!

--- .../@glimmer/runtime/lib/syntax/functions.ts | 23 +++++++++++++++++++ .../runtime/tests/rendering/content-test.ts | 13 +++++++++++ 2 files changed, 36 insertions(+) diff --git a/packages/@glimmer/runtime/lib/syntax/functions.ts b/packages/@glimmer/runtime/lib/syntax/functions.ts index 3c9b3f2014..29a2bba0b4 100644 --- a/packages/@glimmer/runtime/lib/syntax/functions.ts +++ b/packages/@glimmer/runtime/lib/syntax/functions.ts @@ -196,6 +196,29 @@ STATEMENTS.add(Ops.ScannedBlock, (sexp: BaselineSyntax.ScannedBlock, builder) => blocks.compile([Ops.NestedBlock, path, params, hash, templateBlock, inverseBlock], builder); }); +// this fixes an issue with Ember versions using glimmer-vm@0.22 when attempting +// to use nested web components. This is obviously not correct for angle bracket components +// but since no consumers are currently using them with glimmer@0.22.x we are hard coding +// support to just use the fallback case. +STATEMENTS.add(Ops.Component, (sexp: WireFormat.Statements.Component, builder) => { + let [, tag, component ] = sexp; + let { attrs, statements } = component; + + builder.openPrimitiveElement(tag); + + for (let i = 0; i < attrs.length; i++) { + STATEMENTS.compile(attrs[i], builder); + } + + builder.flushElement(); + + for (let i = 0; i < statements.length; i++) { + STATEMENTS.compile(statements[i], builder); + } + + builder.closeElement(); +}); + STATEMENTS.add(Ops.ScannedComponent, (sexp: BaselineSyntax.ScannedComponent, builder) => { let [, tag, attrs, rawArgs, rawBlock] = sexp; let block = rawBlock && rawBlock.scan(); diff --git a/packages/@glimmer/runtime/tests/rendering/content-test.ts b/packages/@glimmer/runtime/tests/rendering/content-test.ts index c06ad9e959..d39aaadca3 100644 --- a/packages/@glimmer/runtime/tests/rendering/content-test.ts +++ b/packages/@glimmer/runtime/tests/rendering/content-test.ts @@ -29,6 +29,19 @@ class StaticContentTests extends RenderingTest { this.assertStableRerender(); } + @template(`Stuff
Here
`) + ['renders nested custom elements']() { + this.render({}); + this.assertContent(`Stuff
Here
`); + this.assertStableRerender(); + } + @template(`Here`) + ['renders MOAR NESTED custom elements']() { + this.render({}); + this.assertContent(`Here`); + this.assertStableRerender(); + } + @template(strip`

Hello World!

From 5fae7debd76794bb2662528dadc6dbe956cda42e Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 17 May 2017 14:44:28 -0400 Subject: [PATCH 2/3] Update lerna.json to fix version mismatch. --- lerna.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lerna.json b/lerna.json index 7380c59f9b..9f66e5d45e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "lerna": "2.0.0-beta.31", + "lerna": "2.0.0-beta.32", "version": "0.22.0", "packages": [ "packages/@glimmer/*" diff --git a/package.json b/package.json index 771a0f0693..53a1f447b2 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "ember-cli-release": "^1.0.0-beta.1", "ember-cli-sauce": "^1.3.0", "glob": "^7.0.5", - "lerna": "2.0.0-beta.31", + "lerna": "2.0.0-beta.32", "loader.js": "^4.0.10", "qunit-tap": "^1.5.1", "qunitjs": "^2.0.1", From 5d47aa4ddff5412641738d7be5ca63598d0e5f8e Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 17 May 2017 14:48:31 -0400 Subject: [PATCH 3/3] Fix types to work for `tsc` in packages and VSCode outside. --- packages/@glimmer/test-helpers/lib/helpers.ts | 2 +- packages/simple-html-tokenizer/index.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@glimmer/test-helpers/lib/helpers.ts b/packages/@glimmer/test-helpers/lib/helpers.ts index 4e9b903b26..fee7d7f66e 100644 --- a/packages/@glimmer/test-helpers/lib/helpers.ts +++ b/packages/@glimmer/test-helpers/lib/helpers.ts @@ -102,7 +102,7 @@ function generateTokens(divOrHTML) { div = divOrHTML; } - return { tokens: tokenize(div.innerHTML), html: div.innerHTML }; + return { tokens: tokenize(div.innerHTML, {}), html: div.innerHTML }; } declare const QUnit: QUnit & { diff --git a/packages/simple-html-tokenizer/index.d.ts b/packages/simple-html-tokenizer/index.d.ts index 56ee888e0c..95791d2a36 100644 --- a/packages/simple-html-tokenizer/index.d.ts +++ b/packages/simple-html-tokenizer/index.d.ts @@ -8,7 +8,7 @@ export class EventedTokenizer { constructor(object: Object, parser: EntityParser) } -export function tokenize(html: string): any; +export function tokenize(html: string, options: any): any; export interface CharRef { [namedRef: string]: string;