Skip to content

Commit c26e8aa

Browse files
authored
fix(framework): rendering is no longer delayed (#1552)
1 parent 0305da8 commit c26e8aa

File tree

3 files changed

+31
-27
lines changed

3 files changed

+31
-27
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const DefinitionsSet = new Set();
2+
3+
const registerTag = tag => {
4+
DefinitionsSet.add(tag);
5+
};
6+
7+
const isTagRegistered = tag => {
8+
return DefinitionsSet.has(tag);
9+
};
10+
11+
const getAllRegisteredTags = () => {
12+
const arr = [];
13+
DefinitionsSet.forEach(tag => {
14+
arr.push(tag);
15+
});
16+
return arr;
17+
};
18+
19+
export {
20+
registerTag,
21+
isTagRegistered,
22+
getAllRegisteredTags,
23+
};

packages/base/src/RenderScheduler.js

+5-24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import RenderQueue from "./RenderQueue.js";
2+
import { getAllRegisteredTags } from "./CustomElementsRegistry.js";
23

34
const MAX_RERENDER_COUNT = 10;
45

@@ -118,33 +119,13 @@ class RenderScheduler {
118119
return renderTaskPromise;
119120
}
120121

121-
static getNotDefinedComponents() {
122-
return Array.from(document.querySelectorAll("*")).filter(el => el.localName.startsWith("ui5-") && !el.isUI5Element);
123-
}
124-
125-
/**
126-
* return a promise that will be resolved once all ui5 webcomponents on the page have their shadow root ready
127-
*/
128-
static async whenShadowDOMReady() {
129-
const undefinedElements = this.getNotDefinedComponents();
130-
131-
const definedPromises = undefinedElements.map(
132-
el => customElements.whenDefined(el.localName)
133-
);
134-
const timeoutPromise = new Promise(resolve => setTimeout(resolve, 5000));
135-
136-
await Promise.race([Promise.all(definedPromises), timeoutPromise]);
137-
const stillUndefined = this.getNotDefinedComponents();
138-
if (stillUndefined.length) {
139-
// eslint-disable-next-line
140-
console.warn("undefined elements after 5 seconds are: " + [...stillUndefined].map(el => el.localName).join(" ; "));
141-
}
142-
143-
return Promise.resolve();
122+
static whenAllCustomElementsAreDefined() {
123+
const definedPromises = getAllRegisteredTags().map(tag => customElements.whenDefined(tag));
124+
return Promise.all(definedPromises);
144125
}
145126

146127
static async whenFinished() {
147-
await RenderScheduler.whenShadowDOMReady();
128+
await RenderScheduler.whenAllCustomElementsAreDefined();
148129
await RenderScheduler.whenDOMUpdated();
149130
}
150131

packages/base/src/UI5Element.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import boot from "./boot.js";
33
import UI5ElementMetadata from "./UI5ElementMetadata.js";
44
import StaticAreaItem from "./StaticAreaItem.js";
55
import RenderScheduler from "./RenderScheduler.js";
6+
import { registerTag, isTagRegistered } from "./CustomElementsRegistry.js";
67
import DOMObserver from "./compatibility/DOMObserver.js";
78
import { skipOriginalEvent } from "./config/NoConflict.js";
89
import getConstructableStyle from "./theming/getConstructableStyle.js";
@@ -18,7 +19,6 @@ const metadata = {
1819
},
1920
};
2021

21-
const DefinitionsSet = new Set();
2222
let autoId = 0;
2323

2424
const elementTimeouts = new Map();
@@ -858,14 +858,14 @@ class UI5Element extends HTMLElement {
858858

859859
const tag = this.getMetadata().getTag();
860860

861-
const definedLocally = DefinitionsSet.has(tag);
861+
const definedLocally = isTagRegistered(tag);
862862
const definedGlobally = customElements.get(tag);
863863

864864
if (definedGlobally && !definedLocally) {
865865
console.warn(`Skipping definition of tag ${tag}, because it was already defined by another instance of ui5-webcomponents.`); // eslint-disable-line
866866
} else if (!definedGlobally) {
867867
this._generateAccessors();
868-
DefinitionsSet.add(tag);
868+
registerTag(tag);
869869
window.customElements.define(tag, this);
870870
}
871871
return this;

0 commit comments

Comments
 (0)