diff --git a/config.js b/config.js index eabd56e9a..bdef28d40 100644 --- a/config.js +++ b/config.js @@ -666,6 +666,11 @@ var config = { // Sets the conference subject // subject: 'Conference Subject', + // This property is related to the use case when jitsi-meet is used via the IFrame API. When the property is true + // jitsi-meet will use the local storage of the host page instead of its own. This option is useful if the browser + // is not persisting the local storage inside the iframe. + // useHostPageLocalStorage: true, + // List of undocumented settings used in jitsi-meet /** _immediateReloadThreshold diff --git a/react/features/base/config/configWhitelist.js b/react/features/base/config/configWhitelist.js index a8636de2b..d79d7c05a 100644 --- a/react/features/base/config/configWhitelist.js +++ b/react/features/base/config/configWhitelist.js @@ -157,6 +157,7 @@ export default [ 'stereo', 'subject', 'testing', + 'useHostPageLocalStorage', 'useTurnUdp', 'videoQuality.persist', 'webrtcIceTcpDisable', diff --git a/react/features/base/jitsi-local-storage/setup.web.js b/react/features/base/jitsi-local-storage/setup.web.js index be4540fbf..93f76a373 100644 --- a/react/features/base/jitsi-local-storage/setup.web.js +++ b/react/features/base/jitsi-local-storage/setup.web.js @@ -8,6 +8,7 @@ import { parseURLParams } from '../util/parseURLParams'; import logger from './logger'; declare var APP: Object; +declare var config: Object; /** * Handles changes of the fake local storage. @@ -18,15 +19,43 @@ function onFakeLocalStorageChanged() { APP.API.notifyLocalStorageChanged(jitsiLocalStorage.serialize()); } +/** + * Checks if the local storage of the host page needs to be used instead jitsi-meet's local storage. + * + * @param {Object} urlParams - Object with parsed URL params. + * @returns {boolean} - True if the local storage of the host page needs to be used instead jitsi-meet's local storage + * and false otherwise. + */ +function shouldUseHostPageLocalStorage(urlParams) { + // NOTE: normally the url params and the config will be merged into the redux store. But we want to setup the local + // storage as soon as possible, the store is not created yet and the merging of the URL params and the config + // haven't been executed yet. That's why we need to manually parse the URL params and also access the config trough + // the global variable. + if (urlParams['config.useHostPageLocalStorage'] === true + || (typeof config === 'object' && config.useHostPageLocalStorage)) { + return true; + } + + if (jitsiLocalStorage.isLocalStorageDisabled()) { // We have detected that ou own local storage is not working. + return true; + } + + if (browser.isWebKitBased()) { // Webkit browsers don't persist local storage for third-party iframes. + return true; + } + + return false; +} + /** * Performs initial setup of the jitsiLocalStorage. * * @returns {void} */ function setupJitsiLocalStorage() { - if (jitsiLocalStorage.isLocalStorageDisabled() || browser.isWebKitBased()) { - const urlParams = parseURLParams(window.location); + const urlParams = parseURLParams(window.location); + if (shouldUseHostPageLocalStorage(urlParams)) { try { const localStorageContent = JSON.parse(urlParams['appData.localStorageContent']);