This commit is contained in:
kakkokari-gtyih 2024-06-29 18:14:35 +09:00
parent 1ed6ed6ef0
commit 7ef81ce6d3
5 changed files with 42 additions and 36 deletions

View File

@ -4,6 +4,7 @@
*/ */
import { miLocalStorage } from '@/local-storage.js'; 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 address = new URL(document.querySelector<HTMLMetaElement>('meta[property="instance_url"]')?.content || location.href);
const siteName = document.querySelector<HTMLMetaElement>('meta[property="og:site_name"]')?.content; 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 instanceName = siteName === 'Misskey' || siteName == null ? host : siteName;
export const ui = miLocalStorage.getItem('ui'); export const ui = miLocalStorage.getItem('ui');
export const debug = miLocalStorage.getItem('debug') === 'true'; 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 { export function updateLocale(newLocale): void {
locale = newLocale; locale = newLocale;

View File

@ -2,7 +2,7 @@
* SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only * 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 = export type Keys =
'v' | 'v' |
@ -45,6 +45,9 @@ export type Keys =
// セッション毎に廃棄されるLocalStorage代替embedなどで使用 // セッション毎に廃棄されるLocalStorage代替embedなどで使用
const safeSessionStorage = new Map<Keys, string>(); const safeSessionStorage = new Map<Keys, string>();
const embedPage = isEmbedPage();
export const miLocalStorage = { export const miLocalStorage = {
getItem: (key: Keys): string | null => { getItem: (key: Keys): string | null => {
if (embedPage) { if (embedPage) {
@ -79,6 +82,24 @@ export const miLocalStorage = {
}; };
if (embedPage) { 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'); if (_DEV_) console.warn('Using safeSessionStorage as localStorage alternative');
} }

View File

@ -15,9 +15,10 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.headerTitle" @click="top"> <div :class="$style.headerTitle" @click="top">
<I18n :src="i18n.ts.noteOf" tag="div" class="_nowrap"> <I18n :src="i18n.ts.noteOf" tag="div" class="_nowrap">
<template #user> <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"/> <MkUserName :user="user"/>
</a> </a>
<span v-else>{{ i18n.ts.user }}</span>
</template> </template>
</I18n> </I18n>
<div :class="$style.sub">{{ i18n.tsx.fromX({ x: instanceName }) }}</div> <div :class="$style.sub">{{ i18n.tsx.fromX({ x: instanceName }) }}</div>

View File

@ -2,12 +2,14 @@
* SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only * 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関連の定義 //#region Embed関連の定義
/** 埋め込みページかどうか */
export function isEmbedPage() {
return location.pathname.startsWith('/embed');
}
/** 埋め込みの対象となるエンティティ(/embed/xxx の xxx の部分と対応させる) */ /** 埋め込みの対象となるエンティティ(/embed/xxx の xxx の部分と対応させる) */
const embeddableEntities = [ const embeddableEntities = [
'notes', 'notes',
@ -36,6 +38,7 @@ export type EmbedParams = {
header?: boolean; header?: boolean;
}; };
/** 正規化されたパラメータ */
export type ParsedEmbedParams = Required<Omit<EmbedParams, 'maxHeight' | 'colorMode'>> & Pick<EmbedParams, 'maxHeight' | 'colorMode'>; export type ParsedEmbedParams = Required<Omit<EmbedParams, 'maxHeight' | 'colorMode'>> & Pick<EmbedParams, 'maxHeight' | 'colorMode'>;
/** パラメータのデフォルトの値 */ /** パラメータのデフォルトの値 */
@ -48,6 +51,8 @@ export const defaultEmbedParams = {
header: true, header: true,
} as const; } as const;
//#endregion
/** /**
* *
* @param searchParams URLSearchParamsもしくはクエリ文字列 * @param searchParams URLSearchParamsもしくはクエリ文字列
@ -84,30 +89,3 @@ export function parseEmbedParams(searchParams: URLSearchParams | string): Parsed
...params, ...params,
}; };
} }
/**
* EmbedページではlocalStorageを使用できないようにしているが
* safeSessionStoragemiLocalStorage内のやつ
*/
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);
}
});
}

View File

@ -15,7 +15,7 @@ import { miLocalStorage } from '@/local-storage.js';
const PREFIX = 'idbfallback::'; 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を無効化している。 // iframe.contentWindow.indexedDB.deleteDatabase() がchromeのバグで使用できないため、indexedDBを無効化している。
// バグが治って再度有効化するのであれば、cypressのコマンド内のコメントアウトを外すこと // バグが治って再度有効化するのであれば、cypressのコマンド内のコメントアウトを外すこと
@ -27,7 +27,10 @@ if (window.Cypress) {
console.log('Cypress detected. It will use localStorage.'); 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') await iset('idb-test', 'test')
.catch(err => { .catch(err => {
console.error('idb error', err); console.error('idb error', err);