summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThaddeus Crews <repiteo@outlook.com>2024-11-25 13:22:29 -0600
committerThaddeus Crews <repiteo@outlook.com>2024-11-25 13:22:29 -0600
commit57125f48cebea05922bb6dc2a999c861dd0e7700 (patch)
treec01ba4b46933c68acd322ceba9f5d3d17496081b
parent81733e66224ea113cf32b69ea93a6c1342d9c6e7 (diff)
parent05b266bd8950330935c51938e0ebe159d87316c8 (diff)
downloadredot-engine-57125f48cebea05922bb6dc2a999c861dd0e7700.tar.gz
Merge pull request #98069 from thedinosoar/fix/service-worker-sandbox-error-98068
[Web] Fix PWA callback assignment causing crash in sandboxed iframes
-rw-r--r--misc/dist/html/editor.html34
-rw-r--r--misc/dist/html/full-size.html8
-rw-r--r--platform/web/js/engine/engine.js6
-rw-r--r--platform/web/js/libs/library_godot_os.js25
4 files changed, 48 insertions, 25 deletions
diff --git a/misc/dist/html/editor.html b/misc/dist/html/editor.html
index 3a22055546..4f2a3bc053 100644
--- a/misc/dist/html/editor.html
+++ b/misc/dist/html/editor.html
@@ -363,24 +363,28 @@ window.addEventListener('load', () => {
btn.style.display = '';
}
if ('serviceWorker' in navigator) {
- navigator.serviceWorker.register('service.worker.js').then(function (reg) {
- if (reg.waiting) {
- notifyUpdate(reg.waiting);
- }
- reg.addEventListener('updatefound', function () {
- const update = reg.installing;
- update.addEventListener('statechange', function () {
- if (update.state === 'installed') {
- // It's a new install, claim and perform aggressive caching.
- if (!reg.active) {
- update.postMessage('claim');
- } else {
- notifyUpdate(update);
+ try {
+ navigator.serviceWorker.register('service.worker.js').then(function (reg) {
+ if (reg.waiting) {
+ notifyUpdate(reg.waiting);
+ }
+ reg.addEventListener('updatefound', function () {
+ const update = reg.installing;
+ update.addEventListener('statechange', function () {
+ if (update.state === 'installed') {
+ // It's a new install, claim and perform aggressive caching.
+ if (!reg.active) {
+ update.postMessage('claim');
+ } else {
+ notifyUpdate(update);
+ }
}
- }
+ });
});
});
- });
+ } catch (e) {
+ console.error('Error while registering service worker:', e);
+ }
}
const missing = Engine.getMissingFeatures({
diff --git a/misc/dist/html/full-size.html b/misc/dist/html/full-size.html
index b59c417d36..3d68b66f49 100644
--- a/misc/dist/html/full-size.html
+++ b/misc/dist/html/full-size.html
@@ -152,9 +152,15 @@ const engine = new Engine(GODOT_CONFIG);
if (missing.length !== 0) {
if (GODOT_CONFIG['serviceWorker'] && GODOT_CONFIG['ensureCrossOriginIsolationHeaders'] && 'serviceWorker' in navigator) {
+ let serviceWorkerRegistrationPromise;
+ try {
+ serviceWorkerRegistrationPromise = navigator.serviceWorker.getRegistration();
+ } catch (err) {
+ serviceWorkerRegistrationPromise = Promise.reject(new Error('Service worker registration failed.'));
+ }
// There's a chance that installing the service worker would fix the issue
Promise.race([
- navigator.serviceWorker.getRegistration().then((registration) => {
+ serviceWorkerRegistrationPromise.then((registration) => {
if (registration != null) {
return Promise.reject(new Error('Service worker already exists.'));
}
diff --git a/platform/web/js/engine/engine.js b/platform/web/js/engine/engine.js
index 04c4c44c5e..1aeeb62f18 100644
--- a/platform/web/js/engine/engine.js
+++ b/platform/web/js/engine/engine.js
@@ -241,7 +241,11 @@ const Engine = (function () {
*/
installServiceWorker: function () {
if (this.config.serviceWorker && 'serviceWorker' in navigator) {
- return navigator.serviceWorker.register(this.config.serviceWorker);
+ try {
+ return navigator.serviceWorker.register(this.config.serviceWorker);
+ } catch (e) {
+ return Promise.reject(e);
+ }
}
return Promise.resolve();
},
diff --git a/platform/web/js/libs/library_godot_os.js b/platform/web/js/libs/library_godot_os.js
index 568212275b..2899d7e45f 100644
--- a/platform/web/js/libs/library_godot_os.js
+++ b/platform/web/js/libs/library_godot_os.js
@@ -441,8 +441,12 @@ const GodotPWA = {
godot_js_pwa_cb__sig: 'vi',
godot_js_pwa_cb: function (p_update_cb) {
if ('serviceWorker' in navigator) {
- const cb = GodotRuntime.get_func(p_update_cb);
- navigator.serviceWorker.getRegistration().then(GodotPWA.updateState.bind(null, cb));
+ try {
+ const cb = GodotRuntime.get_func(p_update_cb);
+ navigator.serviceWorker.getRegistration().then(GodotPWA.updateState.bind(null, cb));
+ } catch (e) {
+ GodotRuntime.error('Failed to assign PWA callback', e);
+ }
}
},
@@ -450,12 +454,17 @@ const GodotPWA = {
godot_js_pwa_update__sig: 'i',
godot_js_pwa_update: function () {
if ('serviceWorker' in navigator && GodotPWA.hasUpdate) {
- navigator.serviceWorker.getRegistration().then(function (reg) {
- if (!reg || !reg.waiting) {
- return;
- }
- reg.waiting.postMessage('update');
- });
+ try {
+ navigator.serviceWorker.getRegistration().then(function (reg) {
+ if (!reg || !reg.waiting) {
+ return;
+ }
+ reg.waiting.postMessage('update');
+ });
+ } catch (e) {
+ GodotRuntime.error(e);
+ return 1;
+ }
return 0;
}
return 1;