From bc0d63ed12bd920d98c2c71b7d9074e1de7fda43 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 7 Jul 2021 09:42:41 +0200 Subject: [PATCH] Better fix for Safari IBD bug (#9514) * Better fix for Safari IBD bug * comment --- src/components/ha-gauge.ts | 5 ++--- src/data/iconsets.ts | 22 +++++++++++++++++++--- src/util/is_safari.ts | 3 +++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/components/ha-gauge.ts b/src/components/ha-gauge.ts index 2f0e71cabc..e5d785b435 100644 --- a/src/components/ha-gauge.ts +++ b/src/components/ha-gauge.ts @@ -6,9 +6,7 @@ import { formatNumber } from "../common/string/format_number"; import { afterNextRender } from "../common/util/render-status"; import { FrontendLocaleData } from "../data/translation"; import { getValueInPercentage, normalize } from "../util/calculate"; - -// Workaround for https://github.com/home-assistant/frontend/issues/6467 -const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); +import { isSafari } from "../util/is_safari"; const getAngle = (value: number, min: number, max: number) => { const percentage = getValueInPercentage(normalize(value, min, max), min, max); @@ -70,6 +68,7 @@ export class Gauge extends LitElement { )} > ${ + // Workaround for https://github.com/home-assistant/frontend/issues/6467 isSafari ? svg` return; } - promiseTimeout( - 1000, + const readIcons = () => iconStore("readonly", (store) => { for (const [iconName_, resolve_, reject_] of toRead) { promisifyRequest(store.get(iconName_)) @@ -37,8 +37,24 @@ export const getIcon = (iconName: string) => .catch((e) => reject_(e)); } toRead = []; + }); + + let readIconPromise: Promise; + + if (isSafari && (indexedDB as any).databases) { + let intervalId: number; + readIconPromise = new Promise((resolveTry) => { + const tryIdb = () => (indexedDB as any).databases().finally(resolveTry); + intervalId = window.setInterval(tryIdb, 100); + tryIdb(); }) - ).catch((e) => { + .then(() => readIcons()) + .finally(() => clearInterval(intervalId)); + } else { + readIconPromise = readIcons(); + } + + promiseTimeout(1000, readIconPromise).catch((e) => { // Firefox in private mode doesn't support IDB // Safari sometime doesn't open the DB so we time out for (const [, , reject_] of toRead) { diff --git a/src/util/is_safari.ts b/src/util/is_safari.ts index e69de29bb2..af3acb78ac 100644 --- a/src/util/is_safari.ts +++ b/src/util/is_safari.ts @@ -0,0 +1,3 @@ +export const isSafari = /^((?!chrome|android).)*safari/i.test( + navigator.userAgent +);