diff --git a/packages/frontend/src/config.ts b/packages/frontend/src/config.ts index 2bec5ae262..cdc7e88ba3 100644 --- a/packages/frontend/src/config.ts +++ b/packages/frontend/src/config.ts @@ -4,6 +4,7 @@ */ import { miLocalStorage } from '@/local-storage.js'; +import { isEmbedPage } from '@/scripts/embed-page.js'; const address = new URL(document.querySelector('meta[property="instance_url"]')?.content || location.href); const siteName = document.querySelector('meta[property="og:site_name"]')?.content; @@ -21,7 +22,9 @@ export const version = _VERSION_; export const instanceName = siteName === 'Misskey' || siteName == null ? host : siteName; export const ui = miLocalStorage.getItem('ui'); export const debug = miLocalStorage.getItem('debug') === 'true'; -export const embedPage = location.pathname.startsWith('/embed'); +// config.tsでインポートしているファイルと、その内部で使用される関数では使用できない。 +// それらでembedPageの判定をしたい場合は関数を直接呼び出すこと +export const embedPage = isEmbedPage(); export function updateLocale(newLocale): void { locale = newLocale; diff --git a/packages/frontend/src/local-storage.ts b/packages/frontend/src/local-storage.ts index 95b0165c19..598ce7da08 100644 --- a/packages/frontend/src/local-storage.ts +++ b/packages/frontend/src/local-storage.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ -import { isEmbedPage, initEmbedPageLocalStorage } from "@/scripts/embed-page.js"; +import { isEmbedPage } from '@/scripts/embed-page.js'; export type Keys = 'v' | @@ -45,6 +45,9 @@ export type Keys = // セッション毎に廃棄されるLocalStorage代替(embedなどで使用) const safeSessionStorage = new Map(); + +const embedPage = isEmbedPage(); + export const miLocalStorage = { getItem: (key: Keys): string | null => { if (embedPage) { @@ -79,6 +82,24 @@ export const miLocalStorage = { }; if (embedPage) { - initEmbedPageLocalStorage(); + /** + * EmbedページではlocalStorageを使用できないようにしているが、 + * 動作に必要な値はsafeSessionStorageに移動する + */ + const keysToDuplicate: Keys[] = [ + 'v', + 'instance', + 'instanceCachedAt', + 'lang', + 'locale', + 'localeVersion', + ]; + + keysToDuplicate.forEach(key => { + const value = window.localStorage.getItem(key); + if (value && !miLocalStorage.getItem(key)) { + miLocalStorage.setItem(key, value); + } + }); if (_DEV_) console.warn('Using safeSessionStorage as localStorage alternative'); } diff --git a/packages/frontend/src/pages/embed/user-timeline.vue b/packages/frontend/src/pages/embed/user-timeline.vue index b1daf8a0d4..420747f65d 100644 --- a/packages/frontend/src/pages/embed/user-timeline.vue +++ b/packages/frontend/src/pages/embed/user-timeline.vue @@ -15,9 +15,10 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.tsx.fromX({ x: instanceName }) }}
diff --git a/packages/frontend/src/scripts/embed-page.ts b/packages/frontend/src/scripts/embed-page.ts index 67268eac00..67f5cc8802 100644 --- a/packages/frontend/src/scripts/embed-page.ts +++ b/packages/frontend/src/scripts/embed-page.ts @@ -2,12 +2,14 @@ * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ -import { miLocalStorage } from "@/local-storage.js"; -import type { Keys } from "@/local-storage.js"; -import { embedPage } from "@/config.js"; //#region Embed関連の定義 +/** 埋め込みページかどうか */ +export function isEmbedPage() { + return location.pathname.startsWith('/embed'); +} + /** 埋め込みの対象となるエンティティ(/embed/xxx の xxx の部分と対応させる) */ const embeddableEntities = [ 'notes', @@ -36,6 +38,7 @@ export type EmbedParams = { header?: boolean; }; +/** 正規化されたパラメータ */ export type ParsedEmbedParams = Required> & Pick; /** パラメータのデフォルトの値 */ @@ -48,6 +51,8 @@ export const defaultEmbedParams = { header: true, } as const; +//#endregion + /** * パラメータを正規化する(埋め込みページ初期化用) * @param searchParams URLSearchParamsもしくはクエリ文字列 @@ -84,30 +89,3 @@ export function parseEmbedParams(searchParams: URLSearchParams | string): Parsed ...params, }; } - -/** - * EmbedページではlocalStorageを使用できないようにしているが、 - * 動作に必要な値はsafeSessionStorage(miLocalStorage内のやつ)に移動する - */ -export function initEmbedPageLocalStorage() { - if (!embedPage) { - return; - } - - const keysToDuplicate: Keys[] = [ - 'v', - 'lastVersion', - 'instance', - 'instanceCachedAt', - 'lang', - 'locale', - 'localeVersion', - ]; - - keysToDuplicate.forEach(key => { - const value = window.localStorage.getItem(key); - if (value && !miLocalStorage.getItem(key)) { - miLocalStorage.setItem(key, value); - } - }); -} diff --git a/packages/frontend/src/scripts/idb-proxy.ts b/packages/frontend/src/scripts/idb-proxy.ts index d3399073a8..a3e81da733 100644 --- a/packages/frontend/src/scripts/idb-proxy.ts +++ b/packages/frontend/src/scripts/idb-proxy.ts @@ -15,7 +15,7 @@ import { miLocalStorage } from '@/local-storage.js'; const PREFIX = 'idbfallback::'; -let idbAvailable = typeof window !== 'undefined' ? !!(window.indexedDB && typeof window.indexedDB.open === 'function' && !embedPage) : true; +let idbAvailable = typeof window !== 'undefined' ? !!(window.indexedDB && typeof window.indexedDB.open === 'function') : true; // iframe.contentWindow.indexedDB.deleteDatabase() がchromeのバグで使用できないため、indexedDBを無効化している。 // バグが治って再度有効化するのであれば、cypressのコマンド内のコメントアウトを外すこと @@ -27,7 +27,10 @@ if (window.Cypress) { console.log('Cypress detected. It will use localStorage.'); } -if (idbAvailable) { +if (embedPage) { + idbAvailable = false; + console.log('Embed page detected. It will use safeSessionStorage.'); +} else if (idbAvailable) { await iset('idb-test', 'test') .catch(err => { console.error('idb error', err);