Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE modernized-built-in-components] Enable feature #19430

Merged
merged 3 commits into from Feb 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -15,6 +15,8 @@ import InternalComponent, {
handleDeprecatedEventArguments,
InternalComponentConstructor,
jQueryEventShim,
ObjectEntries,
ObjectValues,
} from './internal';

const UNINITIALIZED: unknown = Object.freeze({});
Expand Down Expand Up @@ -302,7 +304,7 @@ export function handleDeprecatedFeatures(

handleDeprecatedAttributeArguments(target, attributeBindings);

handleDeprecatedEventArguments(target, Object.entries(virtualEvents));
handleDeprecatedEventArguments(target, ObjectEntries(virtualEvents));

{
let superIsVirtualEventListener = prototype['isVirtualEventListener'];
Expand All @@ -316,7 +318,7 @@ export function handleDeprecatedFeatures(
listener: Function
): listener is VirtualEventListener {
return (
Object.values(virtualEvents).indexOf(name) !== -1 ||
ObjectValues(virtualEvents).indexOf(name) !== -1 ||
superIsVirtualEventListener.call(this, name, listener)
);
},
Expand Down
24 changes: 21 additions & 3 deletions packages/@ember/-internals/glimmer/lib/components/internal.ts
Expand Up @@ -28,6 +28,24 @@ import InternalModifier, { InternalModifierManager } from '../modifiers/internal

function NOOP(): void {}

// TODO: remove me when IE11 support is EOL
export let ObjectEntries = ((): typeof Object['entries'] => {
if (typeof Object.entries === 'function') {
return Object.entries;
} else {
return (obj: {}) => Object.keys(obj).map((key) => [key, obj[key]] as [string, unknown]);
}
})();

// TODO: remove me when IE11 support is EOL
export let ObjectValues = ((): typeof Object['values'] => {
if (typeof Object.values === 'function') {
return Object.values;
} else {
return (obj: {}) => Object.keys(obj).map((key) => obj[key]);
}
})();

export type EventListener = (event: Event) => void;

export default class InternalComponent {
Expand Down Expand Up @@ -418,7 +436,7 @@ if (EMBER_MODERNIZED_BUILT_IN_COMPONENTS) {
name: string
): boolean {
let events = [
...Object.values(getEventsMap(this.owner)),
...ObjectValues(getEventsMap(this.owner)),
'focus-in',
'focus-out',
'key-press',
Expand All @@ -444,7 +462,7 @@ if (EMBER_MODERNIZED_BUILT_IN_COMPONENTS) {
let { element, component, listenerFor, listeners } = this;

let entries: [event: string, argument: string][] = [
...Object.entries(getEventsMap(this.owner)),
...ObjectEntries(getEventsMap(this.owner)),
...extraEvents,
];

Expand All @@ -463,7 +481,7 @@ if (EMBER_MODERNIZED_BUILT_IN_COMPONENTS) {
remove(): void {
let { element, listeners } = this;

for (let [event, listener] of Object.entries(listeners)) {
for (let [event, listener] of ObjectEntries(listeners)) {
element.removeEventListener(event, listener);
}

Expand Down
28 changes: 17 additions & 11 deletions packages/@ember/-internals/views/lib/system/event_dispatcher.js
Expand Up @@ -121,18 +121,8 @@ export default EmberObject.extend({

init() {
this._super();

assert(
'EventDispatcher should never be instantiated in fastboot mode. Please report this as an Ember bug.',
(() => {
let owner = getOwner(this);
let environment = owner.lookup('-environment:main');

return environment.isInteractive;
})()
);

this._eventHandlers = Object.create(null);
this._didSetup = false;
},

/**
Expand All @@ -148,6 +138,16 @@ export default EmberObject.extend({
@param addedEvents {Object}
*/
setup(addedEvents, _rootElement) {
assert(
'EventDispatcher should never be setup in fastboot mode. Please report this as an Ember bug.',
(() => {
let owner = getOwner(this);
let environment = owner.lookup('-environment:main');

return environment.isInteractive;
})()
);

let events = (this._finalEvents = assign({}, get(this, 'events'), addedEvents));

if (_rootElement !== undefined && _rootElement !== null) {
Expand Down Expand Up @@ -230,6 +230,8 @@ export default EmberObject.extend({
this.setupHandler(rootElement, event, events[event]);
}
}

this._didSetup = true;
},

/**
Expand Down Expand Up @@ -432,6 +434,10 @@ export default EmberObject.extend({
},

destroy() {
if (this._didSetup === false) {
return;
}

let rootElementSelector = get(this, 'rootElement');
let rootElement;
if (rootElementSelector.nodeType) {
Expand Down
2 changes: 1 addition & 1 deletion packages/@ember/canary-features/index.ts
Expand Up @@ -18,7 +18,7 @@ export const DEFAULT_FEATURES = {
EMBER_NAMED_BLOCKS: true,
EMBER_GLIMMER_HELPER_MANAGER: true,
EMBER_GLIMMER_INVOKE_HELPER: true,
EMBER_MODERNIZED_BUILT_IN_COMPONENTS: null,
EMBER_MODERNIZED_BUILT_IN_COMPONENTS: true,
EMBER_STRICT_MODE: true,
EMBER_DYNAMIC_HELPERS_AND_MODIFIERS: null,
};
Expand Down