Skip to content

Commit 1522890

Browse files
Set timeout mechanism and loading screen earlier at interactive state so we see the loading screen while images are loading (#5779)
1 parent 0d5e1e2 commit 1522890

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

src/core/a-assets.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ class AAssets extends ANode {
1717
this.timeout = null;
1818
}
1919

20+
/**
21+
* Override connectedCallback to initialize at 'interactive' instead of 'complete'.
22+
* This allows the timeout mechanism to work before loading the images.
23+
* If we wait for 'complete', all resources (including images) are already loaded.
24+
*/
25+
connectedCallback () {
26+
var self = this;
27+
if (document.readyState === 'interactive' || document.readyState === 'complete') {
28+
this.doConnectedCallback();
29+
return;
30+
}
31+
document.addEventListener('readystatechange', function onReadyStateChange () {
32+
if (document.readyState !== 'interactive' && document.readyState !== 'complete') { return; }
33+
document.removeEventListener('readystatechange', onReadyStateChange);
34+
self.doConnectedCallback();
35+
});
36+
}
37+
2038
doConnectedCallback () {
2139
var self = this;
2240
var i;

src/core/scene/a-scene.js

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,37 @@ export class AScene extends AEntity {
7171
document.documentElement.classList.remove('a-fullscreen');
7272
}
7373

74-
doConnectedCallback () {
74+
/**
75+
* Override connectedCallback to set up renderer and loading screen at 'interactive'.
76+
* This allows the loading screen to appear before a-assets starts loading,
77+
* while systems initialization still waits for 'complete' (via aframeready) to handle deferred scripts.
78+
*/
79+
connectedCallback () {
7580
var self = this;
81+
var readyState = document.readyState;
82+
83+
// Set up renderer and loading screen at 'interactive' so they're visible during asset loading.
84+
if (readyState === 'interactive' || readyState === 'complete') {
85+
this.setupRendererAndLoadingScreen();
86+
} else {
87+
document.addEventListener('readystatechange', function onReadyStateChange () {
88+
if (document.readyState !== 'interactive' && document.readyState !== 'complete') { return; }
89+
document.removeEventListener('readystatechange', onReadyStateChange);
90+
self.setupRendererAndLoadingScreen();
91+
});
92+
}
93+
94+
// Wait for 'complete' (aframeready) before initializing systems.
95+
super.connectedCallback();
96+
}
97+
98+
/**
99+
* Set up renderer and loading screen early so they're visible during asset loading.
100+
*/
101+
setupRendererAndLoadingScreen () {
102+
if (this.rendererSetup) { return; }
103+
this.rendererSetup = true;
104+
76105
var embedded = this.hasAttribute('embedded');
77106

78107
// Default components.
@@ -81,7 +110,6 @@ export class AScene extends AEntity {
81110
this.setAttribute('screenshot', '');
82111
this.setAttribute('xr-mode-ui', '');
83112
this.setAttribute('device-orientation-permission-ui', '');
84-
super.doConnectedCallback();
85113

86114
// Renderer initialization
87115
setupCanvas(this);
@@ -90,6 +118,16 @@ export class AScene extends AEntity {
90118

91119
this.resize();
92120
if (!embedded) { this.addFullScreenStyles(); }
121+
}
122+
123+
doConnectedCallback () {
124+
var self = this;
125+
126+
// Renderer may already be set up from connectedCallback at 'interactive'.
127+
// If not, set it up now.
128+
this.setupRendererAndLoadingScreen();
129+
130+
super.doConnectedCallback();
93131
initPostMessageAPI(this);
94132

95133
initMetaTags(this);

0 commit comments

Comments
 (0)