Skip to content

Commit 329b523

Browse files
mrxzchrisirhc
andcommitted
Defer initialization until end of aframe script or manual ready signal
Co-authored-by: Chris Chua <chris.sirhc@gmail.com>
1 parent 7a0297f commit 329b523

File tree

8 files changed

+54
-57
lines changed

8 files changed

+54
-57
lines changed

src/core/a-assets.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,6 @@ class AAssets extends ANode {
1717
this.timeout = null;
1818
}
1919

20-
connectedCallback () {
21-
// Defer if DOM is not ready.
22-
if (document.readyState !== 'complete') {
23-
document.addEventListener('readystatechange', this.onReadyStateChange.bind(this));
24-
return;
25-
}
26-
27-
this.doConnectedCallback();
28-
}
29-
3020
doConnectedCallback () {
3121
var self = this;
3222
var i;
@@ -37,7 +27,7 @@ class AAssets extends ANode {
3727
var imgEls;
3828
var timeout;
3929

40-
super.connectedCallback();
30+
super.doConnectedCallback();
4131

4232
if (!this.parentNode.isScene) {
4333
throw new Error('<a-assets> must be a child of a <a-scene>.');

src/core/a-entity.js

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,13 @@ class AEntity extends ANode {
5757
this.setEntityAttribute(attr, oldVal, newVal);
5858
}
5959

60-
/**
61-
* Add to parent, load, play.
62-
*/
63-
connectedCallback () {
64-
// Defer if DOM is not ready.
65-
if (document.readyState !== 'complete') {
66-
document.addEventListener('readystatechange', this.onReadyStateChange.bind(this));
67-
return;
68-
}
69-
70-
AEntity.prototype.doConnectedCallback.call(this);
71-
}
72-
7360
doConnectedCallback () {
7461
var self = this; // Component.
7562
var assetsEl; // Asset management system element.
7663
var sceneEl;
7764

7865
// ANode method.
79-
super.connectedCallback();
66+
super.doConnectedCallback();
8067

8168
sceneEl = this.sceneEl;
8269

src/core/a-mixin.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,8 @@ class AMixin extends ANode {
1616
this.isMixin = true;
1717
}
1818

19-
connectedCallback () {
20-
// Defer if DOM is not ready.
21-
if (document.readyState !== 'complete') {
22-
document.addEventListener('readystatechange', this.onReadyStateChange.bind(this));
23-
return;
24-
}
25-
26-
this.doConnectedCallback();
27-
}
28-
2919
doConnectedCallback () {
30-
super.connectedCallback();
20+
super.doConnectedCallback();
3121

3222
this.sceneEl = this.closestScene();
3323
this.id = this.getAttribute('id');

src/core/a-node.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* global customElements, CustomEvent, HTMLElement, MutationObserver */
22
var utils = require('../utils/');
3+
var ready = require('./ready');
34

45
var warn = utils.debug('core:a-node:warn');
56

@@ -32,19 +33,13 @@ class ANode extends HTMLElement {
3233
this.mixinEls = [];
3334
}
3435

35-
onReadyStateChange () {
36-
if (document.readyState === 'complete') {
37-
this.doConnectedCallback();
38-
}
39-
}
40-
4136
connectedCallback () {
4237
// Defer if DOM is not ready.
43-
if (document.readyState !== 'complete') {
44-
document.addEventListener('readystatechange', this.onReadyStateChange.bind(this));
38+
if (!ready.isReady) {
39+
document.addEventListener('aframeready', this.connectedCallback.bind(this));
4540
return;
4641
}
47-
ANode.prototype.doConnectedCallback.call(this);
42+
this.doConnectedCallback();
4843
}
4944

5045
doConnectedCallback () {

src/core/ready.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/* global CustomEvent */
2+
3+
/**
4+
* Flag indicating if A-Frame can initialize the scene or should wait.
5+
*/
6+
module.exports.isReady = false;
7+
8+
/**
9+
* Waits for the document to be ready and switches the isReady flag once it is.
10+
*/
11+
function waitForDocumentReadyState () {
12+
if (document.readyState === 'complete') {
13+
ready();
14+
return;
15+
}
16+
17+
document.addEventListener('readystatechange', function onReadyStateChange () {
18+
if (document.readyState !== 'complete') { return; }
19+
document.removeEventListener('readystatechange', onReadyStateChange);
20+
ready();
21+
});
22+
}
23+
module.exports.waitForDocumentReadyState = waitForDocumentReadyState;
24+
25+
/**
26+
* Signals A-Frame that everything is ready to initialize.
27+
*/
28+
function ready () {
29+
if (module.exports.isReady) { return; }
30+
module.exports.isReady = true;
31+
setTimeout(function () {
32+
document.dispatchEvent(new CustomEvent('aframeready'));
33+
});
34+
}
35+
module.exports.ready = ready;

src/core/scene/a-scene.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,6 @@ class AScene extends AEntity {
7070
document.documentElement.classList.remove('a-fullscreen');
7171
}
7272

73-
connectedCallback () {
74-
// Defer if DOM is not ready.
75-
if (document.readyState !== 'complete') {
76-
document.addEventListener('readystatechange', this.onReadyStateChange.bind(this));
77-
return;
78-
}
79-
80-
this.doConnectedCallback();
81-
}
82-
8373
doConnectedCallback () {
8474
var self = this;
8575
var embedded = this.hasAttribute('embedded');
@@ -90,7 +80,7 @@ class AScene extends AEntity {
9080
this.setAttribute('screenshot', '');
9181
this.setAttribute('xr-mode-ui', '');
9282
this.setAttribute('device-orientation-permission-ui', '');
93-
super.connectedCallback();
83+
super.doConnectedCallback();
9484

9585
// Renderer initialization
9686
setupCanvas(this);

src/core/system.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var components = require('./component');
22
var schema = require('./schema');
33
var utils = require('../utils/');
4+
var ready = require('./ready');
45

56
var parseProperties = schema.parseProperties;
67
var parseProperty = schema.parseProperty;
@@ -152,5 +153,7 @@ module.exports.registerSystem = function (name, definition) {
152153
systems[name] = NewSystem;
153154

154155
// Initialize systems for existing scenes
155-
for (i = 0; i < scenes.length; i++) { scenes[i].initSystem(name); }
156+
if (ready.isReady) {
157+
for (i = 0; i < scenes.length; i++) { scenes[i].initSystem(name); }
158+
}
156159
};

src/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ var shaders = require('./core/shader').shaders;
5959
var systems = require('./core/system').systems;
6060
// Exports THREE to window so three.js can be used without alteration.
6161
var THREE = window.THREE = require('./lib/three');
62+
var ready = require('./core/ready');
6263

6364
var pkg = require('../package');
6465

@@ -82,6 +83,11 @@ console.log('THREE Version (https://github.com/supermedium/three.js):',
8283
pkg.dependencies['super-three']);
8384
console.log('WebVR Polyfill Version:', pkg.dependencies['webvr-polyfill']);
8485

86+
// Wait for ready state, unless user asynchronously initializes A-Frame.
87+
if (!window.AFRAME_ASYNC) {
88+
ready.waitForDocumentReadyState();
89+
}
90+
8591
module.exports = window.AFRAME = {
8692
AComponent: require('./core/component').Component,
8793
AEntity: AEntity,
@@ -104,6 +110,7 @@ module.exports = window.AFRAME = {
104110
schema: require('./core/schema'),
105111
shaders: shaders,
106112
systems: systems,
113+
ready: ready.ready,
107114
THREE: THREE,
108115
utils: utils,
109116
version: pkg.version

0 commit comments

Comments
 (0)