From d5edd2452ae8edf146152531611d31a7a732e26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Sat, 23 Jul 2022 00:33:00 +0000 Subject: [PATCH] Refactor browserID handling. Force retaining browserID on logout --- custom_components/browser_mod/browser_mod.js | 69 +++++++++++++------- js/plugin/browserID.ts | 47 +++++++++++++ js/plugin/connection.ts | 22 +------ js/plugin/main.ts | 7 +- 4 files changed, 101 insertions(+), 44 deletions(-) create mode 100644 js/plugin/browserID.ts diff --git a/custom_components/browser_mod/browser_mod.js b/custom_components/browser_mod/browser_mod.js index c1b69f2..1ecf64e 100644 --- a/custom_components/browser_mod/browser_mod.js +++ b/custom_components/browser_mod/browser_mod.js @@ -327,7 +327,6 @@ const loadHaForm = async () => { await card.getConfigElement(); }; -const ID_STORAGE_KEY = "browser_mod-browser-id"; const ConnectionMixin = (SuperClass) => { class BrowserModConnection extends SuperClass { constructor() { @@ -514,27 +513,8 @@ const ConnectionMixin = (SuperClass) => { data, }); } - get browserID() { - if (localStorage[ID_STORAGE_KEY]) - return localStorage[ID_STORAGE_KEY]; - this.browserID = ""; - return this.browserID; - } - set browserID(id) { + browserIDChanged(oldID, newID) { var _a, _b; - function _createBrowserID() { - var _a, _b; - const s4 = () => { - return Math.floor((1 + Math.random()) * 100000) - .toString(16) - .substring(1); - }; - return (_b = (_a = window.fully) === null || _a === void 0 ? void 0 : _a.getDeviceId()) !== null && _b !== void 0 ? _b : `${s4()}${s4()}-${s4()}${s4()}`; - } - if (id === "") - id = _createBrowserID(); - const oldID = localStorage[ID_STORAGE_KEY]; - localStorage[ID_STORAGE_KEY] = id; this.fireEvent("browser-mod-config-update"); if (((_a = this.browsers) === null || _a === void 0 ? void 0 : _a[oldID]) !== undefined && ((_b = this.browsers) === null || _b === void 0 ? void 0 : _b[this.browserID]) === undefined) { @@ -1964,6 +1944,51 @@ const AutoSettingsMixin = (SuperClass) => { }; }; +const ID_STORAGE_KEY = "browser_mod-browser-id"; +const BrowserIDMixin = (SuperClass) => { + return class BrowserIDMixinClass extends SuperClass { + constructor() { + super(); + if (Storage) { + if (!Storage.prototype.browser_mod_patched) { + const _clear = Storage.prototype.clear; + Storage.prototype.clear = function () { + const browserId = this.getItem(ID_STORAGE_KEY); + const suspendWhenHidden = this.getItem("suspendWhenHidden"); + _clear.apply(this); + this.setItem(ID_STORAGE_KEY, browserId); + this.setItem("suspendWhenHidden", suspendWhenHidden); + }; + Storage.prototype.browser_mod_patched = true; + } + } + } + get browserID() { + if (localStorage[ID_STORAGE_KEY]) + return localStorage[ID_STORAGE_KEY]; + this.browserID = ""; + return this.browserID; + } + set browserID(id) { + function _createBrowserID() { + var _a, _b; + const s4 = () => { + return Math.floor((1 + Math.random()) * 100000) + .toString(16) + .substring(1); + }; + return (_b = (_a = window.fully) === null || _a === void 0 ? void 0 : _a.getDeviceId()) !== null && _b !== void 0 ? _b : `${s4()}${s4()}-${s4()}${s4()}`; + } + if (id === "") + id = _createBrowserID(); + const oldID = localStorage[ID_STORAGE_KEY]; + localStorage[ID_STORAGE_KEY] = id; + this.browserIDChanged(oldID, id); + } + browserIDChanged(oldID, newID) { } + }; +}; + /* TODO: - Fix nomenclature @@ -2012,7 +2037,7 @@ const AutoSettingsMixin = (SuperClass) => { - Media_seek - Screensavers */ -class BrowserMod extends ServicesMixin(PopupMixin(ActivityMixin(BrowserStateMixin(CameraMixin(MediaPlayerMixin(ScreenSaverMixin(AutoSettingsMixin(FullyMixin(RequireInteractMixin(ConnectionMixin(EventTarget))))))))))) { +class BrowserMod extends ServicesMixin(PopupMixin(ActivityMixin(BrowserStateMixin(CameraMixin(MediaPlayerMixin(ScreenSaverMixin(AutoSettingsMixin(FullyMixin(RequireInteractMixin(ConnectionMixin(BrowserIDMixin(EventTarget)))))))))))) { constructor() { super(); this.connect(); diff --git a/js/plugin/browserID.ts b/js/plugin/browserID.ts new file mode 100644 index 0000000..a0333cc --- /dev/null +++ b/js/plugin/browserID.ts @@ -0,0 +1,47 @@ +const ID_STORAGE_KEY = "browser_mod-browser-id"; + +export const BrowserIDMixin = (SuperClass) => { + return class BrowserIDMixinClass extends SuperClass { + constructor() { + super(); + + if (Storage) { + if (!Storage.prototype.browser_mod_patched) { + const _clear = Storage.prototype.clear; + Storage.prototype.clear = function () { + const browserId = this.getItem(ID_STORAGE_KEY); + const suspendWhenHidden = this.getItem("suspendWhenHidden"); + _clear.apply(this); + this.setItem(ID_STORAGE_KEY, browserId); + this.setItem("suspendWhenHidden", suspendWhenHidden); + }; + Storage.prototype.browser_mod_patched = true; + } + } + } + + get browserID() { + if (localStorage[ID_STORAGE_KEY]) return localStorage[ID_STORAGE_KEY]; + this.browserID = ""; + return this.browserID; + } + set browserID(id) { + function _createBrowserID() { + const s4 = () => { + return Math.floor((1 + Math.random()) * 100000) + .toString(16) + .substring(1); + }; + return window.fully?.getDeviceId() ?? `${s4()}${s4()}-${s4()}${s4()}`; + } + + if (id === "") id = _createBrowserID(); + const oldID = localStorage[ID_STORAGE_KEY]; + localStorage[ID_STORAGE_KEY] = id; + + this.browserIDChanged(oldID, id); + } + + protected browserIDChanged(oldID, newID) {} + }; +}; diff --git a/js/plugin/connection.ts b/js/plugin/connection.ts index 44f81ac..eedc017 100644 --- a/js/plugin/connection.ts +++ b/js/plugin/connection.ts @@ -1,7 +1,5 @@ import { hass, provideHass } from "../helpers"; -const ID_STORAGE_KEY = "browser_mod-browser-id"; - export const ConnectionMixin = (SuperClass) => { class BrowserModConnection extends SuperClass { public hass; @@ -202,25 +200,7 @@ export const ConnectionMixin = (SuperClass) => { }); } - get browserID() { - if (localStorage[ID_STORAGE_KEY]) return localStorage[ID_STORAGE_KEY]; - this.browserID = ""; - return this.browserID; - } - set browserID(id) { - function _createBrowserID() { - const s4 = () => { - return Math.floor((1 + Math.random()) * 100000) - .toString(16) - .substring(1); - }; - return window.fully?.getDeviceId() ?? `${s4()}${s4()}-${s4()}${s4()}`; - } - - if (id === "") id = _createBrowserID(); - const oldID = localStorage[ID_STORAGE_KEY]; - localStorage[ID_STORAGE_KEY] = id; - + browserIDChanged(oldID, newID) { this.fireEvent("browser-mod-config-update"); if ( diff --git a/js/plugin/main.ts b/js/plugin/main.ts index 4a48326..b1a5ad6 100644 --- a/js/plugin/main.ts +++ b/js/plugin/main.ts @@ -15,6 +15,7 @@ import { PopupMixin } from "./popups"; import pjson from "../../package.json"; import "./popup-card"; import { AutoSettingsMixin } from "./frontend-settings"; +import { BrowserIDMixin } from "./browserID"; /* TODO: @@ -72,7 +73,11 @@ export class BrowserMod extends ServicesMixin( MediaPlayerMixin( ScreenSaverMixin( AutoSettingsMixin( - FullyMixin(RequireInteractMixin(ConnectionMixin(EventTarget))) + FullyMixin( + RequireInteractMixin( + ConnectionMixin(BrowserIDMixin(EventTarget)) + ) + ) ) ) )