From 866862c44ac9eed78f86a52f4bc2cb7f18a8bfb1 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 6 Aug 2019 00:12:35 -0400
Subject: [PATCH 1/5] Track xr mode requested in global context
---
src/Window.js | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/Window.js b/src/Window.js
index e8ba3188c1..b21e22c484 100644
--- a/src/Window.js
+++ b/src/Window.js
@@ -103,6 +103,7 @@ GlobalContext.id = id;
GlobalContext.args = args;
GlobalContext.version = version;
GlobalContext.baseUrl = options.baseUrl;
+GlobalContext.requestedXr = false;
const {_parseDocument, _parseDocumentAst, getBoundDocumentElements, DocumentType, DOMImplementation, initDocument} = require('./Document');
const {
@@ -824,7 +825,12 @@ const _makeRequestAnimationFrame = window => (fn, priority = 0) => {
return _parseDocumentAst(htmlAst, window, false);
}
};
- window.addEventListener = EventTarget.prototype.addEventListener.bind(window);
+ window.addEventListener = function(e, fn, opts) {
+ if (e === 'vrdisplayactivate') {
+ GlobalContext.requestedXr = true;
+ }
+ return EventTarget.prototype.addEventListener.apply(window, arguments);
+ };
window.removeEventListener = EventTarget.prototype.removeEventListener.bind(window);
window.dispatchEvent = EventTarget.prototype.dispatchEvent.bind(window);
window.Image = HTMLImageElement;
@@ -1193,6 +1199,8 @@ const _makeRequestAnimationFrame = window => (fn, priority = 0) => {
const _makeMrDisplays = () => {
const _onrequestpresent = async () => {
+ GlobalContext.requestedXr = true;
+
// if (!GlobalContext.xrState.isPresenting[0]) {
await new Promise((accept, reject) => {
vrPresentState.responseAccepts.push(accept);
From 49ba2dccdc82cbdf96a5b92bacbec2ff0fa8e3e1 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 6 Aug 2019 00:13:42 -0400
Subject: [PATCH 2/5] Post xr mode detection from window to parent
---
src/Document.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/Document.js b/src/Document.js
index 73b1e40519..37161180ef 100644
--- a/src/Document.js
+++ b/src/Document.js
@@ -209,6 +209,11 @@ function initDocument (document, window) {
document.dispatchEvent(new Event('load', {target: document}));
window.dispatchEvent(new Event('load', {target: window}));
+
+ parentPort.postMessage({
+ method: 'xrMode',
+ xr: GlobalContext.requestedXr,
+ });
});
return document;
From c86d0578cff3fdf0f55875c3166d5bc0871d0ef4 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 6 Aug 2019 00:34:07 -0400
Subject: [PATCH 3/5] Add window vm on xr mode event tracking
---
src/WindowVm.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/WindowVm.js b/src/WindowVm.js
index 8239be67e0..21f5c28127 100644
--- a/src/WindowVm.js
+++ b/src/WindowVm.js
@@ -194,6 +194,9 @@ const _makeWindow = (options = {}, handlers = {}) => {
window.on('framebuffer', e => {
window.framebuffer = e;
});
+ window.on('xrMode', e => {
+ options.onxrmode && options.onxrmode(e);
+ });
window.on('hapticPulse', e => {
options.onhapticpulse && options.onhapticpulse(e);
});
From fbbb1938ed4ea2b0cb33f154ca54a1f1f2501cbc Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 6 Aug 2019 00:38:11 -0400
Subject: [PATCH 4/5] Add HTMLIframeElement xrmode event capture and emit
---
src/DOM.js | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/DOM.js b/src/DOM.js
index 98bb744e11..44ee402199 100644
--- a/src/DOM.js
+++ b/src/DOM.js
@@ -2221,6 +2221,13 @@ class HTMLIFrameElement extends HTMLSrcableElement {
onrequest(req) {
parentPort.postMessage(req);
},
+ onxrmode(event) {
+ this.dispatchEvent(new CustomEvent('xrmode', {
+ detail: {
+ xr: event.xr,
+ },
+ }));
+ },
onhapticpulse(event) {
parentPort.postMessage({
method: 'emit',
From 2bd896f0886c6c5d50cef0cb859e805c4f0123d7 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 6 Aug 2019 00:39:04 -0400
Subject: [PATCH 5/5] Make Document.js HTML initialization more defensive
---
src/Document.js | 26 +++++++++++++++++++-------
1 file changed, 19 insertions(+), 7 deletions(-)
diff --git a/src/Document.js b/src/Document.js
index 37161180ef..71f1dc2e07 100644
--- a/src/Document.js
+++ b/src/Document.js
@@ -162,6 +162,14 @@ function initDocument (document, window) {
}
process.nextTick(async () => {
+ const _tryDispatchEvent = (target, event) => {
+ try {
+ target.dispatchEvent(event);
+ } catch(err) {
+ console.warn(err);
+ }
+ };
+
if (body) {
const bodyChildNodes = body.childNodes;
body.childNodes = new window.NodeList();
@@ -173,7 +181,11 @@ function initDocument (document, window) {
}
body.childNodes = bodyChildNodes;
- body._emit('children', Array.from(bodyChildNodes), [], null, null);
+ try {
+ body._emit('children', Array.from(bodyChildNodes), [], null, null);
+ } catch(err) {
+ console.warn(err);
+ }
try {
await GlobalContext._runHtml(document.body, window);
@@ -182,9 +194,9 @@ function initDocument (document, window) {
}
document.readyState = 'interactive';
- document.dispatchEvent(new Event('readystatechange', {target: document}));
+ _tryDispatchEvent(document, new Event('readystatechange', {target: document}));
- document.dispatchEvent(new Event('DOMContentLoaded', {
+ _tryDispatchEvent(document, new Event('DOMContentLoaded', {
target: document,
bubbles: true,
}));
@@ -196,19 +208,19 @@ function initDocument (document, window) {
}
document.readyState = 'interactive';
- document.dispatchEvent(new Event('readystatechange', {target: document}));
+ _tryDispatchEvent(document, new Event('readystatechange', {target: document}));
- document.dispatchEvent(new Event('DOMContentLoaded', {
+ _tryDispatchEvent(document, new Event('DOMContentLoaded', {
target: document,
bubbles: true,
}));
}
document.readyState = 'complete';
- document.dispatchEvent(new Event('readystatechange', {target: document}));
+ _tryDispatchEvent(document, new Event('readystatechange', {target: document}));
document.dispatchEvent(new Event('load', {target: document}));
- window.dispatchEvent(new Event('load', {target: window}));
+ _tryDispatchEvent(window, new Event('load', {target: window}));
parentPort.postMessage({
method: 'xrMode',