From 7ef81ce6d3ef34c26498165d3c152bb53909a92e Mon Sep 17 00:00:00 2001
From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Sat, 29 Jun 2024 18:14:35 +0900
Subject: [PATCH] fix

---
 packages/frontend/src/config.ts               |  5 ++-
 packages/frontend/src/local-storage.ts        | 25 +++++++++++-
 .../src/pages/embed/user-timeline.vue         |  3 +-
 packages/frontend/src/scripts/embed-page.ts   | 38 ++++---------------
 packages/frontend/src/scripts/idb-proxy.ts    |  7 +++-
 5 files changed, 42 insertions(+), 36 deletions(-)

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<HTMLMetaElement>('meta[property="instance_url"]')?.content || location.href);
 const siteName = document.querySelector<HTMLMetaElement>('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<Keys, string>();
 
+
+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
 				<div :class="$style.headerTitle" @click="top">
 					<I18n :src="i18n.ts.noteOf" tag="div" class="_nowrap">
 						<template #user>
-							<a :href="`/@${user.username}`" target="_blank" rel="noopener noreferrer">
+							<a v-if="user != null" :href="`/@${user.username}`" target="_blank" rel="noopener noreferrer">
 								<MkUserName :user="user"/>
 							</a>
+							<span v-else>{{ i18n.ts.user }}</span>
 						</template>
 					</I18n>
 					<div :class="$style.sub">{{ i18n.tsx.fromX({ x: instanceName }) }}</div>
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<Omit<EmbedParams, 'maxHeight' | 'colorMode'>> & Pick<EmbedParams, 'maxHeight' | 'colorMode'>;
 
 /** パラメータのデフォルトの値 */
@@ -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);