From 31c40f881526752f1b7102fb4d80d8004b4e76fe Mon Sep 17 00:00:00 2001 From: Godfrey Chan Date: Tue, 26 Mar 2019 15:45:02 -0400 Subject: [PATCH 1/4] [CLEANUP] remove unused `findElementInParentElement` --- .../views/lib/mixins/view_support.js | 19 +------------------ tests/docs/expected.js | 1 - 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/@ember/-internals/views/lib/mixins/view_support.js b/packages/@ember/-internals/views/lib/mixins/view_support.js index 214baf95529..bb3e8d0b76a 100644 --- a/packages/@ember/-internals/views/lib/mixins/view_support.js +++ b/packages/@ember/-internals/views/lib/mixins/view_support.js @@ -266,23 +266,6 @@ let mixin = { */ elementId: null, - /** - Attempts to discover the element in the parent element. The default - implementation looks for an element with an ID of `elementId` (or the - view's guid if `elementId` is null). You can override this method to - provide your own form of lookup. For example, if you want to discover your - element using a CSS class name instead of an ID. - - @method findElementInParentElement - @param {DOMElement} parentElement The parent's DOM element - @return {DOMElement} The discovered element - @private - */ - findElementInParentElement(parentElem) { - let id = `#${this.elementId}`; - return jQuery(id)[0] || jQuery(id, parentElem)[0]; - }, - /** Called when a view is going to insert an element into the DOM. @@ -367,7 +350,7 @@ let mixin = { must destroy and recreate the view element. By default, the render buffer will use a `
` tag for views. - + If the tagName is `''`, the view will be tagless, with no outer element. Component properties that depend on the presence of an outer element, such as `classNameBindings` and `attributeBindings`, do not work with tagless diff --git a/tests/docs/expected.js b/tests/docs/expected.js index 835053f0a98..1712ba689c0 100644 --- a/tests/docs/expected.js +++ b/tests/docs/expected.js @@ -211,7 +211,6 @@ module.exports = { 'finally', 'find', 'findBy', - 'findElementInParentElement', 'findModel', 'findWithAssert', 'firstObject', From 6ba61a1c5c1e405ec5d039289014ee7e5c8cc83e Mon Sep 17 00:00:00 2001 From: Godfrey Chan Date: Tue, 26 Mar 2019 17:24:09 -0400 Subject: [PATCH 2/4] [BUGFIX canary] don't rely on `elementId` for event dispatching Since the `id` attribute can be passed through splattributes, relying on `elementId` for event dispatching is not quite correct. --- .../glimmer/lib/component-managers/curly.ts | 8 ++++- .../-internals/glimmer/lib/component.ts | 9 ++++- .../@ember/-internals/glimmer/lib/renderer.ts | 33 +++++++------------ .../lib/utils/curly-component-state-bucket.ts | 8 +++++ packages/@ember/-internals/views/index.d.ts | 14 ++++---- packages/@ember/-internals/views/index.js | 5 ++- .../views/lib/system/event_dispatcher.js | 24 ++++---------- .../-internals/views/lib/system/utils.js | 30 +++++++++++++---- .../-internals/views/lib/views/core_view.js | 3 -- packages/@ember/engine/index.js | 1 - .../lib/test-cases/abstract-rendering.js | 9 +++-- 11 files changed, 84 insertions(+), 60 deletions(-) diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts index 01b601222ff..c07f0850d40 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts @@ -2,7 +2,12 @@ import { privatize as P } from '@ember/-internals/container'; import { get } from '@ember/-internals/metal'; import { getOwner } from '@ember/-internals/owner'; import { guidFor } from '@ember/-internals/utils'; -import { addChildView, OwnedTemplateMeta, setViewElement } from '@ember/-internals/views'; +import { + addChildView, + OwnedTemplateMeta, + setElementView, + setViewElement, +} from '@ember/-internals/views'; import { assert, debugFreeze } from '@ember/debug'; import { _instrumentStart } from '@ember/instrumentation'; import { assign } from '@ember/polyfills'; @@ -340,6 +345,7 @@ export default class CurlyComponentManager operations: ElementOperations ): void { setViewElement(component, element); + setElementView(element, component); let { attributeBindings, classNames, classNameBindings } = component; diff --git a/packages/@ember/-internals/glimmer/lib/component.ts b/packages/@ember/-internals/glimmer/lib/component.ts index 2e76976be4a..1cc5e8d9179 100644 --- a/packages/@ember/-internals/glimmer/lib/component.ts +++ b/packages/@ember/-internals/glimmer/lib/component.ts @@ -725,7 +725,14 @@ const Component = CoreView.extend( */ readDOMAttr(name: string) { // TODO revisit this - let element = getViewElement(this); + let _element = getViewElement(this); + + assert( + `Cannot call \`readDOMAttr\` on ${this} which does not have an element`, + _element !== null + ); + + let element = _element!; let isSVG = element.namespaceURI === SVG_NAMESPACE; let { type, normalized } = normalizeProperty(element, name); diff --git a/packages/@ember/-internals/glimmer/lib/renderer.ts b/packages/@ember/-internals/glimmer/lib/renderer.ts index 1d3417601be..8907264c87d 100644 --- a/packages/@ember/-internals/glimmer/lib/renderer.ts +++ b/packages/@ember/-internals/glimmer/lib/renderer.ts @@ -1,14 +1,9 @@ import { ENV } from '@ember/-internals/environment'; import { runInTransaction } from '@ember/-internals/metal'; -import { - fallbackViewRegistry, - getViewElement, - getViewId, - setViewElement, -} from '@ember/-internals/views'; +import { getViewElement, getViewId } from '@ember/-internals/views'; import { assert } from '@ember/debug'; import { backburner, getCurrentRunLoop } from '@ember/runloop'; -import { Simple } from '@glimmer/interfaces'; +import { Option, Simple } from '@glimmer/interfaces'; import { CURRENT_TAG, VersionedPathReference } from '@glimmer/reference'; import { clientBuilder, @@ -245,12 +240,14 @@ function loopEnd() { backburner.on('begin', loopBegin); backburner.on('end', loopEnd); +interface ViewRegistry { + [viewId: string]: Opaque; +} + export abstract class Renderer { private _env: Environment; private _rootTemplate: any; - private _viewRegistry: { - [viewId: string]: Opaque; - }; + private _viewRegistry: ViewRegistry; private _destinedForDOM: boolean; private _destroyed: boolean; private _roots: RootState[]; @@ -262,13 +259,13 @@ export abstract class Renderer { constructor( env: Environment, rootTemplate: OwnedTemplate, - _viewRegistry = fallbackViewRegistry, + viewRegistry: ViewRegistry, destinedForDOM = false, builder = clientBuilder ) { this._env = env; this._rootTemplate = rootTemplate; - this._viewRegistry = _viewRegistry; + this._viewRegistry = viewRegistry; this._destinedForDOM = destinedForDOM; this._destroyed = false; this._roots = []; @@ -331,15 +328,9 @@ export abstract class Renderer { this.cleanupRootFor(view); - setViewElement(view, null); - if (this._destinedForDOM) { view.trigger('didDestroyElement'); } - - if (!view.isDestroying) { - view.destroy(); - } } cleanupRootFor(view: Opaque) { @@ -370,7 +361,7 @@ export abstract class Renderer { this._clearAllRoots(); } - abstract getElement(view: Opaque): Simple.Element | undefined; + abstract getElement(view: Opaque): Option; getBounds(view: Component) { let bounds = view[BOUNDS]; @@ -533,7 +524,7 @@ export class InertRenderer extends Renderer { return new this(env, rootTemplate, _viewRegistry, false, builder); } - getElement(_view: Opaque): Simple.Element | undefined { + getElement(_view: Opaque): Option { throw new Error( 'Accessing `this.element` is not allowed in non-interactive environments (such as FastBoot).' ); @@ -555,7 +546,7 @@ export class InteractiveRenderer extends Renderer { return new this(env, rootTemplate, _viewRegistry, true, builder); } - getElement(view: Opaque): Simple.Element | undefined { + getElement(view: Opaque): Option { return getViewElement(view); } } diff --git a/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts b/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts index 611fd85f9d6..fd760a4c115 100644 --- a/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts +++ b/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts @@ -1,3 +1,4 @@ +import { clearElementView, clearViewElement, getViewElement } from '@ember/-internals/views'; import { Revision, VersionedReference } from '@glimmer/reference'; import { CapturedNamedArguments } from '@glimmer/runtime'; import { Opaque } from '@glimmer/util'; @@ -54,6 +55,13 @@ export default class ComponentStateBucket { if (environment.isInteractive) { component.trigger('willDestroyElement'); component.trigger('willClearRender'); + + let element = getViewElement(component); + + if (element) { + clearElementView(element); + clearViewElement(component); + } } environment.destroyedComponents.push(component); diff --git a/packages/@ember/-internals/views/index.d.ts b/packages/@ember/-internals/views/index.d.ts index 919ae57f4aa..0c976f0d047 100644 --- a/packages/@ember/-internals/views/index.d.ts +++ b/packages/@ember/-internals/views/index.d.ts @@ -1,4 +1,4 @@ -import { Simple, Template } from '@glimmer/interfaces'; +import { Simple, Template, Option } from '@glimmer/interfaces'; import { Opaque } from '@glimmer/util'; import { Factory, Owner } from '@ember/-internals/owner'; @@ -21,8 +21,12 @@ export const ViewMixin: any; export const ViewStateSupport: any; export const TextSupport: any; -export function getViewElement(view: Opaque): Simple.Element; -export function setViewElement(view: Opaque, element: Simple.Element | null): void; +export function getElementView(element: Simple.Element): Opaque; +export function getViewElement(view: Opaque): Option; +export function setElementView(element: Simple.Element, view: Opaque): void; +export function setViewElement(view: Opaque, element: Simple.Element): void; +export function clearElementView(element: Simple.Element): void; +export function clearViewElement(view: Opaque): void; export function addChildView(parent: Opaque, child: Opaque): void; @@ -45,10 +49,6 @@ export function lookupPartial(templateName: string, owner: Owner): any; export function getViewId(view: any): string; -export const fallbackViewRegistry: { - [id: string]: any | undefined; -}; - export const MUTABLE_CELL: string; export const ActionManager: { diff --git a/packages/@ember/-internals/views/index.js b/packages/@ember/-internals/views/index.js index 96b7370cf40..23a99099c34 100644 --- a/packages/@ember/-internals/views/index.js +++ b/packages/@ember/-internals/views/index.js @@ -8,8 +8,12 @@ export { getRootViews, getChildViews, getViewId, + getElementView, getViewElement, + setElementView, setViewElement, + clearElementView, + clearViewElement, constructStyleDeprecationMessage, } from './lib/system/utils'; export { default as EventDispatcher } from './lib/system/event_dispatcher'; @@ -25,4 +29,3 @@ export { MUTABLE_CELL } from './lib/compat/attrs'; export { default as lookupPartial, hasPartial } from './lib/system/lookup_partial'; export { default as lookupComponent } from './lib/utils/lookup-component'; export { default as ActionManager } from './lib/system/action_manager'; -export { default as fallbackViewRegistry } from './lib/compat/fallback-view-registry'; diff --git a/packages/@ember/-internals/views/lib/system/event_dispatcher.js b/packages/@ember/-internals/views/lib/system/event_dispatcher.js index 565719e2e21..3af4a24536b 100644 --- a/packages/@ember/-internals/views/lib/system/event_dispatcher.js +++ b/packages/@ember/-internals/views/lib/system/event_dispatcher.js @@ -3,9 +3,9 @@ import { assign } from '@ember/polyfills'; import { assert } from '@ember/debug'; import { get, set } from '@ember/-internals/metal'; import { Object as EmberObject } from '@ember/-internals/runtime'; +import { getElementView } from '@ember/-internals/views'; import jQuery, { jQueryDisabled } from './jquery'; import ActionManager from './action_manager'; -import fallbackViewRegistry from '../compat/fallback-view-registry'; import addJQueryEventDeprecation from './jquery_event_deprecation'; import { contains } from './utils'; import { JQUERY_INTEGRATION } from '@ember/deprecated-features'; @@ -216,11 +216,9 @@ export default EmberObject.extend({ } } - let viewRegistry = this._getViewRegistry(); - for (let event in events) { if (events.hasOwnProperty(event)) { - this.setupHandler(rootElement, event, events[event], viewRegistry); + this.setupHandler(rootElement, event, events[event]); } } }, @@ -238,16 +236,15 @@ export default EmberObject.extend({ @param {Element} rootElement @param {String} event the browser-originated event to listen to @param {String} eventName the name of the method to call on the view - @param {Object} viewRegistry */ - setupHandler(rootElement, event, eventName, viewRegistry) { + setupHandler(rootElement, event, eventName) { if (eventName === null) { return; } if (!JQUERY_INTEGRATION || jQueryDisabled) { let viewHandler = (target, event) => { - let view = viewRegistry[target.id]; + let view = getElementView(target); let result = true; if (view) { @@ -340,7 +337,7 @@ export default EmberObject.extend({ (related === null || (related !== target && !contains(target, related))) ) { // mouseEnter/Leave don't bubble, so there is no logic to prevent it as with other events - if (viewRegistry[target.id]) { + if (getElementView(target)) { viewHandler(target, createFakeEvent(origEventType, event)); } else if (target.hasAttribute('data-ember-action')) { actionHandler(target, createFakeEvent(origEventType, event)); @@ -358,7 +355,7 @@ export default EmberObject.extend({ let target = event.target; do { - if (viewRegistry[target.id]) { + if (getElementView(target)) { if (viewHandler(target, event) === false) { event.preventDefault(); event.stopPropagation(); @@ -378,7 +375,7 @@ export default EmberObject.extend({ } } else { rootElement.on(`${event}.ember`, '.ember-view', function(evt) { - let view = viewRegistry[this.id]; + let view = getElementView(this); let result = true; if (view) { @@ -417,13 +414,6 @@ export default EmberObject.extend({ } }, - _getViewRegistry() { - let owner = getOwner(this); - let viewRegistry = (owner && owner.lookup('-view-registry:main')) || fallbackViewRegistry; - - return viewRegistry; - }, - destroy() { let rootElementSelector = get(this, 'rootElement'); let rootElement; diff --git a/packages/@ember/-internals/views/lib/system/utils.js b/packages/@ember/-internals/views/lib/system/utils.js index 9cb623335e0..7e4334d24f3 100644 --- a/packages/@ember/-internals/views/lib/system/utils.js +++ b/packages/@ember/-internals/views/lib/system/utils.js @@ -1,6 +1,6 @@ import { getOwner } from '@ember/-internals/owner'; /* globals Element */ -import { guidFor, symbol } from '@ember/-internals/utils'; +import { guidFor } from '@ember/-internals/utils'; /** @module ember @@ -60,7 +60,12 @@ export function getViewId(view) { } } -const VIEW_ELEMENT = symbol('VIEW_ELEMENT'); +const ELEMENT_VIEW = new WeakMap(); +const VIEW_ELEMENT = new WeakMap(); + +export function getElementView(element) { + return ELEMENT_VIEW.get(element) || null; +} /** @private @@ -68,15 +73,28 @@ const VIEW_ELEMENT = symbol('VIEW_ELEMENT'); @param {Ember.View} view */ export function getViewElement(view) { - return view[VIEW_ELEMENT]; + return VIEW_ELEMENT.get(view) || null; } -export function initViewElement(view) { - view[VIEW_ELEMENT] = null; +export function setElementView(element, view) { + ELEMENT_VIEW.set(element, view); } export function setViewElement(view, element) { - return (view[VIEW_ELEMENT] = element); + VIEW_ELEMENT.set(view, element); +} + +// These are not needed for GC, but for correctness. We want to be able to +// null-out these links while the objects are still live. Specifically, in +// this case, we want to prevent access to the element (and vice verse) during +// destruction. + +export function clearElementView(element) { + ELEMENT_VIEW.delete(element); +} + +export function clearViewElement(view) { + VIEW_ELEMENT.delete(view); } const CHILD_VIEW_IDS = new WeakMap(); diff --git a/packages/@ember/-internals/views/lib/views/core_view.js b/packages/@ember/-internals/views/lib/views/core_view.js index d428e3fc435..1dff54ba394 100644 --- a/packages/@ember/-internals/views/lib/views/core_view.js +++ b/packages/@ember/-internals/views/lib/views/core_view.js @@ -1,5 +1,4 @@ import { ActionHandler, Evented, FrameworkObject } from '@ember/-internals/runtime'; -import { initViewElement } from '../system/utils'; import states from './states'; /** @@ -28,8 +27,6 @@ const CoreView = FrameworkObject.extend(Evented, ActionHandler, { this._state = 'preRender'; this._currentState = this._states.preRender; - initViewElement(this); - if (!this.renderer) { throw new Error( `Cannot instantiate a component without a renderer. Please ensure that you are creating ${this} with a proper container/registry.` diff --git a/packages/@ember/engine/index.js b/packages/@ember/engine/index.js index 3b4c9ab672b..97bd4a3bf34 100644 --- a/packages/@ember/engine/index.js +++ b/packages/@ember/engine/index.js @@ -497,7 +497,6 @@ function commonSetupRegistry(registry) { registry.injection('view', '_viewRegistry', '-view-registry:main'); registry.injection('renderer', '_viewRegistry', '-view-registry:main'); - registry.injection('event_dispatcher:main', '_viewRegistry', '-view-registry:main'); registry.injection('route', '_topLevelViewTemplate', 'template:-outlet'); diff --git a/packages/internal-test-helpers/lib/test-cases/abstract-rendering.js b/packages/internal-test-helpers/lib/test-cases/abstract-rendering.js index f32af637b57..cd2fb59524b 100644 --- a/packages/internal-test-helpers/lib/test-cases/abstract-rendering.js +++ b/packages/internal-test-helpers/lib/test-cases/abstract-rendering.js @@ -21,12 +21,17 @@ export default class AbstractRenderingTestCase extends AbstractTestCase { bootOptions, })); + owner.register('-view-registry:main', Object.create(null), { instantiate: false }); + owner.register('event_dispatcher:main', EventDispatcher); + + // TODO: why didn't buildOwner do this for us? + owner.inject('view', '_viewRegistry', '-view-registry:main'); + owner.inject('renderer', '_viewRegistry', '-view-registry:main'); + this.renderer = this.owner.lookup('renderer:-dom'); this.element = document.querySelector('#qunit-fixture'); this.component = null; - owner.register('event_dispatcher:main', EventDispatcher); - owner.inject('event_dispatcher:main', '_viewRegistry', '-view-registry:main'); if (!bootOptions || bootOptions.isInteractive !== false) { owner.lookup('event_dispatcher:main').setup(this.getCustomDispatcherEvents(), this.element); } From a08596f9743b0eedced24af011e8b6b711a1a38b Mon Sep 17 00:00:00 2001 From: Godfrey Chan Date: Wed, 27 Mar 2019 09:32:50 -0400 Subject: [PATCH 3/4] stop using @id in tests --- .../angle-bracket-invocation-test.js | 34 +++- .../link-to/query-params-angle-test.js | 82 ++++----- .../link-to/rendering-angle-test.js | 2 +- .../components/link-to/routing-angle-test.js | 157 +++++++++--------- .../transitioning-classes-angle-test.js | 14 +- 5 files changed, 156 insertions(+), 133 deletions(-) diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js index c1cdd05a236..0ecfea65700 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js @@ -94,20 +94,46 @@ moduleFor( content: 'bizz bizz', }); - runTask(() => this.rerender()); + this.assertStableRerender(); + + runTask(() => set(this.context, 'customId', 'bar')); + + this.assertComponentElement(this.firstChild, { + tagName: 'div', + attrs: { id: 'bizz' }, + content: 'bar bizz', + }); + + runTask(() => set(this.context, 'customId', 'bizz')); this.assertComponentElement(this.firstChild, { tagName: 'div', attrs: { id: 'bizz' }, content: 'bizz bizz', }); + } - runTask(() => set(this.context, 'customId', 'bar')); + '@test it can have a custom id attribute and it is bound'() { + this.registerComponent('foo-bar', { template: 'hello' }); + + this.render('', { + customId: 'bizz', + }); this.assertComponentElement(this.firstChild, { tagName: 'div', attrs: { id: 'bizz' }, - content: 'bar bizz', + content: 'hello', + }); + + this.assertStableRerender(); + + runTask(() => set(this.context, 'customId', 'bar')); + + this.assertComponentElement(this.firstChild, { + tagName: 'div', + attrs: { id: 'bar' }, + content: 'hello', }); runTask(() => set(this.context, 'customId', 'bizz')); @@ -115,7 +141,7 @@ moduleFor( this.assertComponentElement(this.firstChild, { tagName: 'div', attrs: { id: 'bizz' }, - content: 'bizz bizz', + content: 'hello', }); } diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/query-params-angle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/query-params-angle-test.js index c89d83b6f58..36c22206b0e 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/query-params-angle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/query-params-angle-test.js @@ -110,7 +110,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { } [`@test doesn't update controller QP properties on current route when invoked`](assert) { - this.addTemplate('index', `Index`); + this.addTemplate('index', `Index`); return this.visit('/').then(() => { this.click('#the-link'); @@ -129,7 +129,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { ) { this.addTemplate( 'index', - `Index` + `Index` ); return this.visit('/').then(() => { @@ -147,7 +147,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { [`@test doesn't update controller QP properties on current route when invoked (empty query-params obj, inferred route)`]( assert ) { - this.addTemplate('index', `Index`); + this.addTemplate('index', `Index`); return this.visit('/').then(() => { this.click('#the-link'); @@ -165,7 +165,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + Index ` @@ -189,7 +189,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + Index ` @@ -217,7 +217,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + About ` @@ -243,7 +243,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + Index ` @@ -265,7 +265,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + Index ` @@ -294,7 +294,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + Index ` @@ -323,15 +323,15 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'cars', ` - Create new car - Page 2 + Create new car + Page 2 {{outlet}} ` ); this.addTemplate( 'cars.create', - `Close create form` + `Close create form` ); this.router.map(function() { @@ -374,22 +374,22 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - Index - Index - Index + Index + Index + Index ` ); this.addTemplate( 'search', ` - Index - Index - Index - Index - Index - Index - Index + Index + Index + Index + Index + Index + Index + Index {{outlet}} ` ); @@ -397,13 +397,13 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'search.results', ` - Index - Index - Index - Index - Index - Index - Index + Index + Index + Index + Index + Index + Index + Index ` ); @@ -480,7 +480,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + Index ` @@ -509,9 +509,9 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - Index - Index - Index + Index + Index + Index ` ); @@ -562,9 +562,9 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'application', ` - Parent - Child - Parent + Parent + Child + Parent {{outlet}} ` ); @@ -602,7 +602,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'application', ` - + Parent {{outlet}} @@ -612,7 +612,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'parent', ` - + Parent {{outlet}} @@ -675,9 +675,9 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'application', ` - Foos - Baz Foos - Quux Bars + Foos + Baz Foos + Quux Bars ` ); 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 48b9ab05227..68493a3434c 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 @@ -12,7 +12,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { [`@test throws a useful error if you invoke it wrong`](assert) { assert.expect(1); - this.addTemplate('application', `Index`); + this.addTemplate('application', `Index`); expectAssertion(() => { this.visit('/'); diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/routing-angle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/routing-angle-test.js index 2b1fe78393b..19d6bab6f47 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/routing-angle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/routing-angle-test.js @@ -42,16 +42,16 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About - Self + About + Self ` ); this.addTemplate( 'about', `

About

- Home - Self + Home + Self ` ); } @@ -91,7 +91,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { [`@test the component doesn't add an href when the tagName isn't 'a'`](assert) { this.addTemplate( 'index', - `About` + `About` ); return this.visit('/').then(() => { @@ -103,8 +103,8 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - About - About + About + About ` ); @@ -142,7 +142,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { [`@test the component doesn't apply a 'disabled' class if disabledWhen is not provided`]( assert ) { - this.addTemplate('index', `About`); + this.addTemplate('index', `About`); return this.visit('/').then(() => { assert.ok( @@ -155,7 +155,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { [`@test the component supports a custom disabledClass`](assert) { this.addTemplate( 'index', - `About` + `About` ); return this.visit('/').then(() => { @@ -172,7 +172,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { ) { this.addTemplate( 'index', - `About` + `About` ); this.add( @@ -194,7 +194,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { [`@test the component does not respond to clicks when disabledWhen`](assert) { this.addTemplate( 'index', - `About` + `About` ); return this.visit('/') @@ -209,7 +209,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { [`@test the component does not respond to clicks when disabled`](assert) { this.addTemplate( 'index', - `About` + `About` ); return this.visit('/') @@ -226,7 +226,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { ) { this.addTemplate( 'index', - `About` + `About` ); this.add( @@ -265,8 +265,8 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About - Self + About + Self ` ); @@ -290,8 +290,8 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About - Self + About + Self ` ); @@ -325,7 +325,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About + About ` ); @@ -388,16 +388,16 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About - Self + About + Self ` ); this.addTemplate( 'about', `

About

- Home - Self + Home + Self ` ); } @@ -414,7 +414,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About + About ` ); @@ -443,7 +443,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About + About ` ); @@ -477,7 +477,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About + About ` ); @@ -523,16 +523,16 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About - Self + About + Self ` ); this.addTemplate( 'about', `

About

- Home - Self + Home + Self ` ); } @@ -633,7 +633,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate('index', `

Home

{{outlet}}`); this.addTemplate( 'index.about', - `ITEM` + `ITEM` ); return this.visit('/about').then(() => { @@ -661,7 +661,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate('index', `

Home

{{outlet}}`); this.addTemplate( 'index.about', - `ITEM` + `ITEM` ); return this.visit('/about').then(() => { @@ -696,7 +696,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate('index', `

Home

{{outlet}}`); this.addTemplate( 'index.about', - `ITEM` + `ITEM` ); return this.visit('/about').then(() => { @@ -720,15 +720,15 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate('index', `

Home

{{outlet}}`); this.addTemplate( 'index.about', - `ITEM` + `ITEM` ); this.addTemplate( 'item', - `ITEM` + `ITEM` ); this.addTemplate( 'foo', - `ITEM` + `ITEM` ); return this.visit('/about') @@ -770,8 +770,8 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index.about', ` - ITEM - ITEM + ITEM + ITEM ` ); @@ -802,7 +802,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'about', `
- About + About
{{outlet}} ` @@ -845,7 +845,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'about', `
- + About
@@ -890,7 +890,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'about', `
- + About
@@ -949,13 +949,13 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) {
    {{#each model as |person|}}
  • - + {{person.name}}
  • {{/each}}
- Home + Home ` ); @@ -964,7 +964,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { `

Item

{{model.name}}

- Home + Home ` ); @@ -972,7 +972,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- About + About ` ); @@ -1027,7 +1027,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- + Self ` @@ -1046,7 +1046,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- Self + Self ` ); @@ -1063,7 +1063,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- Self + Self ` ); @@ -1085,7 +1085,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.route('about'); }); - this.addTemplate('index', `About`); + this.addTemplate('index', `About`); return this.visit('/').then(() => { assertNav({ prevented: true }, () => this.$('#about-link').click(), assert); @@ -1101,7 +1101,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', - `About` + `About` ); return this.visit('/').then(() => { @@ -1118,7 +1118,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', - `About` + `About` ); this.add( @@ -1140,7 +1140,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- Self + Self ` ); @@ -1154,7 +1154,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- Self + Self ` ); @@ -1169,7 +1169,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + About ` @@ -1215,11 +1215,11 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'filter', `

{{filter}}

- Unpopular - Unpopular - Post - Post - Repo + Unpopular + Unpopular + Post + Post + Repo ` ); @@ -1258,12 +1258,12 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'lobby.index', - `Lobby` + `Lobby` ); this.addTemplate( 'lobby.list', - `Lobby` + `Lobby` ); return this.visit('/lobby/list') @@ -1279,8 +1279,8 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - string - path + string + path ` ); @@ -1314,7 +1314,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { let post = { id: '1' }; let secondPost = { id: '2' }; - this.addTemplate('index', `post`); + this.addTemplate('index', `post`); this.add('controller:index', Controller.extend()); @@ -1357,8 +1357,8 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'about', `
- About - Item + About + Item {{outlet}}
` @@ -1462,10 +1462,10 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'application', ` - Home - Default Post + Home + Default Post {{#if currentPost}} - Current Post + Current Post {{/if}} ` ); @@ -1512,8 +1512,8 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'application', ` - OMG - LOL + OMG + LOL ` ); @@ -1541,7 +1541,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { }) ); - this.addTemplate('index', `Index`); + this.addTemplate('index', `Index`); return this.visit('/').then(() => { assert.equal(this.$('#the-link').attr('href'), '/', 'link has right href'); @@ -1561,7 +1561,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', - `Index` + `Index` ); return this.visit('/').then(() => { @@ -1587,7 +1587,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'application', - `Index` + `Index` ); return this.visit('/') @@ -1667,7 +1667,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'index', `

Home

- Dynamic + Dynamic ` ); @@ -1705,10 +1705,7 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { }) ); - this.addTemplate( - 'application', - `Parent` - ); + this.addTemplate('application', `Parent`); return this.visit('/') .then(() => { @@ -1739,10 +1736,10 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { this.addTemplate( 'index', ` - + string - + string ` diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/transitioning-classes-angle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/transitioning-classes-angle-test.js index dc1306c5f67..2d1ffb92fa0 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/transitioning-classes-angle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/transitioning-classes-angle-test.js @@ -66,10 +66,10 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { 'application', ` {{outlet}} - Index - About - Other - News + Index + About + Other + News ` ); } @@ -193,13 +193,13 @@ if (EMBER_GLIMMER_ANGLE_BRACKET_BUILT_INS) { ` {{outlet}} - Index + Index - About + About - Other + Other ` ); From d1688b5234ff51dfdd77637e3dd4d2d7a3834856 Mon Sep 17 00:00:00 2001 From: Godfrey Chan Date: Wed, 27 Mar 2019 13:17:14 -0400 Subject: [PATCH 4/4] export getElementView --- packages/ember/index.js | 1 + packages/ember/tests/reexports_test.js | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/ember/index.js b/packages/ember/index.js index 6125477d372..fdda6f97ecc 100644 --- a/packages/ember/index.js +++ b/packages/ember/index.js @@ -588,6 +588,7 @@ if (JQUERY_INTEGRATION && !views.jQueryDisabled) { Ember.ViewUtils = { isSimpleClick: views.isSimpleClick, + getElementView: views.getElementView, getViewElement: views.getViewElement, getViewBounds: views.getViewBounds, getViewClientRects: views.getViewClientRects, diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index 882914b7167..62d310aa4be 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -194,6 +194,7 @@ let allExports = [ // @ember/-internals/views ['ViewUtils.isSimpleClick', '@ember/-internals/views', 'isSimpleClick'], + ['ViewUtils.getElementView', '@ember/-internals/views', 'getElementView'], ['ViewUtils.getViewElement', '@ember/-internals/views', 'getViewElement'], ['ViewUtils.getViewBounds', '@ember/-internals/views', 'getViewBounds'], ['ViewUtils.getViewClientRects', '@ember/-internals/views', 'getViewClientRects'],