From d87aea9f49876d6b45f46a24da67f25f45a1ec0b Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Tue, 6 Aug 2019 13:10:21 +0200
Subject: [PATCH] Add a wrapper for customElements.define() which adds some
 error handling

In case the browser doesn't support custom elements and shadow dom we display
an error instead of the element.

This assumes the JS code executed thus far didn't lead to errors, so this only works
for semi-modern browers.
---
 packages/common/utils.js | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/packages/common/utils.js b/packages/common/utils.js
index 435d82e5..f48977fe 100644
--- a/packages/common/utils.js
+++ b/packages/common/utils.js
@@ -69,5 +69,27 @@ module.exports = {
         });
 
         return btoa(utf8Bytes);
+    },
+
+    /**
+     * Like customElements.define() but tries to display an error in case the browser doesn't
+     * support everything we need.
+     *
+     * Returns false in case define failed, true otherwise.
+     *
+     * @returns {boolean}
+     */
+    defineCustomElement: (name, constructor, options) => {
+        // Checks taken from https://github.com/webcomponents/webcomponentsjs/blob/master/webcomponents-loader.js
+        if (!('attachShadow' in Element.prototype && 'getRootNode' in Element.prototype && window.customElements)) {
+            var elements = document.getElementsByTagName(name);
+            for(var i=0; i < elements.length; i++) {
+                elements[i].innerHTML = "<span style='border: 1px solid red; font-size: 0.8em; "
+                    + "opacity: 0.5; padding: 0.2em;'>☹ Your browser is not supported ☹</span>";
+            }
+           return false;
+        }
+        customElements.define(name, constructor, options);
+        return true;
     }
 };
-- 
GitLab