Merge branch 'develop' into fix-mkrange-tooltip
This commit is contained in:
		
						commit
						3080f15e93
					
				|  | @ -9,11 +9,14 @@ | |||
| - Enhance: サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように | ||||
| - Enhance: アイコンデコレーション管理画面にプレビューを追加 | ||||
| - Fix: サーバーメトリクスが2つ以上あるとリロード直後の表示がおかしくなる問題を修正 | ||||
| - Fix: 月の違う同じ日はセパレータが表示されないのを修正 | ||||
| - Fix: タッチ画面でレンジスライダーを操作するとツールチップが複数表示される問題を修正   | ||||
|   (Cherry-picked from https://github.com/taiyme/misskey/pull/265) | ||||
| 
 | ||||
| ### Server | ||||
| - Fix: ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正 | ||||
| - Fix: 外部ページを解析する際に、ページに紐づけられた関連リソースも読み込まれてしまう問題を修正   | ||||
|   (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/commit/26e0412fbb91447c37e8fb06ffb0487346063bb8) | ||||
| 
 | ||||
| 
 | ||||
| ## 2024.8.0 | ||||
|  |  | |||
|  | @ -119,7 +119,7 @@ | |||
| 		"fluent-ffmpeg": "2.1.3", | ||||
| 		"form-data": "4.0.0", | ||||
| 		"got": "14.4.2", | ||||
| 		"happy-dom": "10.0.3", | ||||
| 		"happy-dom": "15.6.1", | ||||
| 		"hpagent": "1.2.0", | ||||
| 		"htmlescape": "1.1.1", | ||||
| 		"http-link-header": "1.1.3", | ||||
|  |  | |||
|  | @ -207,16 +207,41 @@ export class ApRequestService { | |||
| 
 | ||||
| 		if ((contentType ?? '').split(';')[0].trimEnd().toLowerCase() === 'text/html' && _followAlternate === true) { | ||||
| 			const html = await res.text(); | ||||
| 			const window = new Window(); | ||||
| 			const window = new Window({ | ||||
| 				settings: { | ||||
| 					disableJavaScriptEvaluation: true, | ||||
| 					disableJavaScriptFileLoading: true, | ||||
| 					disableCSSFileLoading: true, | ||||
| 					disableComputedStyleRendering: true, | ||||
| 					handleDisabledFileLoadingAsSuccess: true, | ||||
| 					navigation: { | ||||
| 						disableMainFrameNavigation: true, | ||||
| 						disableChildFrameNavigation: true, | ||||
| 						disableChildPageNavigation: true, | ||||
| 						disableFallbackToSetURL: true, | ||||
| 					}, | ||||
| 					timer: { | ||||
| 						maxTimeout: 0, | ||||
| 						maxIntervalTime: 0, | ||||
| 						maxIntervalIterations: 0, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}); | ||||
| 			const document = window.document; | ||||
| 			document.documentElement.innerHTML = html; | ||||
| 			try { | ||||
| 				document.documentElement.innerHTML = html; | ||||
| 
 | ||||
| 			const alternate = document.querySelector('head > link[rel="alternate"][type="application/activity+json"]'); | ||||
| 			if (alternate) { | ||||
| 				const href = alternate.getAttribute('href'); | ||||
| 				if (href) { | ||||
| 					return await this.signedGet(href, user, false); | ||||
| 				const alternate = document.querySelector('head > link[rel="alternate"][type="application/activity+json"]'); | ||||
| 				if (alternate) { | ||||
| 					const href = alternate.getAttribute('href'); | ||||
| 					if (href) { | ||||
| 						return await this.signedGet(href, user, false); | ||||
| 					} | ||||
| 				} | ||||
| 			} catch (e) { | ||||
| 				// something went wrong parsing the HTML, ignore the whole thing
 | ||||
| 			} finally { | ||||
| 				window.close(); | ||||
| 			} | ||||
| 		} | ||||
| 		//#endregion
 | ||||
|  |  | |||
|  | @ -43,9 +43,9 @@ export default defineComponent({ | |||
| 	setup(props, { slots, expose }) { | ||||
| 		const $style = useCssModule(); // カスタムレンダラなので使っても大丈夫 | ||||
| 
 | ||||
| 		function getDateText(time: string) { | ||||
| 			const date = new Date(time).getDate(); | ||||
| 			const month = new Date(time).getMonth() + 1; | ||||
| 		function getDateText(dateInstance: Date) { | ||||
| 			const date = dateInstance.getDate(); | ||||
| 			const month = dateInstance.getMonth() + 1; | ||||
| 			return i18n.tsx.monthAndDay({ | ||||
| 				month: month.toString(), | ||||
| 				day: date.toString(), | ||||
|  | @ -62,9 +62,16 @@ export default defineComponent({ | |||
| 			})[0]; | ||||
| 			if (el.key == null && item.id) el.key = item.id; | ||||
| 
 | ||||
| 			const date = new Date(item.createdAt); | ||||
| 			const nextDate = props.items[i + 1] ? new Date(props.items[i + 1].createdAt) : null; | ||||
| 
 | ||||
| 			if ( | ||||
| 				i !== props.items.length - 1 && | ||||
| 				new Date(item.createdAt).getDate() !== new Date(props.items[i + 1].createdAt).getDate() | ||||
| 				nextDate != null && ( | ||||
| 					date.getFullYear() !== nextDate.getFullYear() || | ||||
| 					date.getMonth() !== nextDate.getMonth() || | ||||
| 					date.getDate() !== nextDate.getDate() | ||||
| 				) | ||||
| 			) { | ||||
| 				const separator = h('div', { | ||||
| 					class: $style['separator'], | ||||
|  | @ -78,12 +85,12 @@ export default defineComponent({ | |||
| 						h('i', { | ||||
| 							class: `ti ti-chevron-up ${$style['date-1-icon']}`, | ||||
| 						}), | ||||
| 						getDateText(item.createdAt), | ||||
| 						getDateText(date), | ||||
| 					]), | ||||
| 					h('span', { | ||||
| 						class: $style['date-2'], | ||||
| 					}, [ | ||||
| 						getDateText(props.items[i + 1].createdAt), | ||||
| 						getDateText(nextDate), | ||||
| 						h('i', { | ||||
| 							class: `ti ti-chevron-down ${$style['date-2-icon']}`, | ||||
| 						}), | ||||
|  |  | |||
|  | @ -63,7 +63,7 @@ async function detachAndDeleteMedia(file: Misskey.entities.DriveFile) { | |||
| 
 | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'warning', | ||||
| 		text: i18n.t('driveFileDeleteConfirm', { name: file.name }), | ||||
| 		text: i18n.tsx.driveFileDeleteConfirm({ name: file.name }), | ||||
| 	}); | ||||
| 
 | ||||
| 	if (canceled) return; | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| <template> | ||||
| <div class="_gaps_m"> | ||||
| 	<div :class="$style.buttons"> | ||||
| 		<MkButton inline primary @click="saveNew">{{ ts._preferencesBackups.saveNew }}</MkButton> | ||||
| 		<MkButton inline @click="loadFile">{{ ts._preferencesBackups.loadFile }}</MkButton> | ||||
| 		<MkButton inline primary @click="saveNew">{{ i18n.ts._preferencesBackups.saveNew }}</MkButton> | ||||
| 		<MkButton inline @click="loadFile">{{ i18n.ts._preferencesBackups.loadFile }}</MkButton> | ||||
| 	</div> | ||||
| 
 | ||||
| 	<FormSection> | ||||
| 		<template #label>{{ ts._preferencesBackups.list }}</template> | ||||
| 		<template #label>{{ i18n.ts._preferencesBackups.list }}</template> | ||||
| 		<template v-if="profiles && Object.keys(profiles).length > 0"> | ||||
| 			<div class="_gaps_s"> | ||||
| 				<div | ||||
|  | @ -23,13 +23,13 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 					@contextmenu.prevent.stop="$event => menu($event, id)" | ||||
| 				> | ||||
| 					<div :class="$style.profileName">{{ profile.name }}</div> | ||||
| 					<div :class="$style.profileTime">{{ t('_preferencesBackups.createdAt', { date: (new Date(profile.createdAt)).toLocaleDateString(), time: (new Date(profile.createdAt)).toLocaleTimeString() }) }}</div> | ||||
| 					<div v-if="profile.updatedAt" :class="$style.profileTime">{{ t('_preferencesBackups.updatedAt', { date: (new Date(profile.updatedAt)).toLocaleDateString(), time: (new Date(profile.updatedAt)).toLocaleTimeString() }) }}</div> | ||||
| 					<div :class="$style.profileTime">{{ i18n.tsx._preferencesBackups.createdAt({ date: (new Date(profile.createdAt)).toLocaleDateString(), time: (new Date(profile.createdAt)).toLocaleTimeString() }) }}</div> | ||||
| 					<div v-if="profile.updatedAt" :class="$style.profileTime">{{ i18n.tsx._preferencesBackups.updatedAt({ date: (new Date(profile.updatedAt)).toLocaleDateString(), time: (new Date(profile.updatedAt)).toLocaleTimeString() }) }}</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		</template> | ||||
| 		<div v-else-if="profiles"> | ||||
| 			<MkInfo>{{ ts._preferencesBackups.noBackups }}</MkInfo> | ||||
| 			<MkInfo>{{ i18n.ts._preferencesBackups.noBackups }}</MkInfo> | ||||
| 		</div> | ||||
| 		<MkLoading v-else/> | ||||
| 	</FormSection> | ||||
|  | @ -52,7 +52,6 @@ import { i18n } from '@/i18n.js'; | |||
| import { version, host } from '@@/js/config.js'; | ||||
| import { definePageMetadata } from '@/scripts/page-metadata.js'; | ||||
| import { miLocalStorage } from '@/local-storage.js'; | ||||
| const { t, ts } = i18n; | ||||
| 
 | ||||
| const defaultStoreSaveKeys: (keyof typeof defaultStore['state'])[] = [ | ||||
| 	'collapseRenotes', | ||||
|  | @ -201,15 +200,15 @@ async function saveNew(): Promise<void> { | |||
| 	if (!profiles.value) return; | ||||
| 
 | ||||
| 	const { canceled, result: name } = await os.inputText({ | ||||
| 		title: ts._preferencesBackups.inputName, | ||||
| 		title: i18n.ts._preferencesBackups.inputName, | ||||
| 		default: '', | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
| 	if (Object.values(profiles.value).some(x => x.name === name)) { | ||||
| 		return os.alert({ | ||||
| 			title: ts._preferencesBackups.cannotSave, | ||||
| 			text: t('_preferencesBackups.nameAlreadyExists', { name }), | ||||
| 			title: i18n.ts._preferencesBackups.cannotSave, | ||||
| 			text: i18n.tsx._preferencesBackups.nameAlreadyExists({ name }), | ||||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -238,8 +237,8 @@ function loadFile(): void { | |||
| 		if (file.type !== 'application/json') { | ||||
| 			return os.alert({ | ||||
| 				type: 'error', | ||||
| 				title: ts._preferencesBackups.cannotLoad, | ||||
| 				text: ts._preferencesBackups.invalidFile, | ||||
| 				title: i18n.ts._preferencesBackups.cannotLoad, | ||||
| 				text: i18n.ts._preferencesBackups.invalidFile, | ||||
| 			}); | ||||
| 		} | ||||
| 
 | ||||
|  | @ -250,7 +249,7 @@ function loadFile(): void { | |||
| 		} catch (err) { | ||||
| 			return os.alert({ | ||||
| 				type: 'error', | ||||
| 				title: ts._preferencesBackups.cannotLoad, | ||||
| 				title: i18n.ts._preferencesBackups.cannotLoad, | ||||
| 				text: (err as any)?.message ?? '', | ||||
| 			}); | ||||
| 		} | ||||
|  | @ -276,8 +275,8 @@ async function applyProfile(id: string): Promise<void> { | |||
| 
 | ||||
| 	const { canceled: cancel1 } = await os.confirm({ | ||||
| 		type: 'warning', | ||||
| 		title: ts._preferencesBackups.apply, | ||||
| 		text: t('_preferencesBackups.applyConfirm', { name: profile.name }), | ||||
| 		title: i18n.ts._preferencesBackups.apply, | ||||
| 		text: i18n.tsx._preferencesBackups.applyConfirm({ name: profile.name }), | ||||
| 	}); | ||||
| 	if (cancel1) return; | ||||
| 
 | ||||
|  | @ -322,7 +321,7 @@ async function applyProfile(id: string): Promise<void> { | |||
| 
 | ||||
| 	const { canceled: cancel2 } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		text: ts.reloadToApplySetting, | ||||
| 		text: i18n.ts.reloadToApplySetting, | ||||
| 	}); | ||||
| 	if (cancel2) return; | ||||
| 
 | ||||
|  | @ -334,8 +333,8 @@ async function deleteProfile(id: string): Promise<void> { | |||
| 
 | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		title: ts.delete, | ||||
| 		text: t('deleteAreYouSure', { x: profiles.value[id].name }), | ||||
| 		title: i18n.ts.delete, | ||||
| 		text: i18n.tsx.deleteAreYouSure({ x: profiles.value[id].name }), | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
|  | @ -350,8 +349,8 @@ async function save(id: string): Promise<void> { | |||
| 
 | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		title: ts._preferencesBackups.save, | ||||
| 		text: t('_preferencesBackups.saveConfirm', { name }), | ||||
| 		title: i18n.ts._preferencesBackups.save, | ||||
| 		text: i18n.tsx._preferencesBackups.saveConfirm({ name }), | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
|  | @ -370,15 +369,15 @@ async function rename(id: string): Promise<void> { | |||
| 	if (!profiles.value) return; | ||||
| 
 | ||||
| 	const { canceled: cancel1, result: name } = await os.inputText({ | ||||
| 		title: ts._preferencesBackups.inputName, | ||||
| 		title: i18n.ts._preferencesBackups.inputName, | ||||
| 		default: '', | ||||
| 	}); | ||||
| 	if (cancel1 || profiles.value[id].name === name) return; | ||||
| 
 | ||||
| 	if (Object.values(profiles.value).some(x => x.name === name)) { | ||||
| 		return os.alert({ | ||||
| 			title: ts._preferencesBackups.cannotSave, | ||||
| 			text: t('_preferencesBackups.nameAlreadyExists', { name }), | ||||
| 			title: i18n.ts._preferencesBackups.cannotSave, | ||||
| 			text: i18n.tsx._preferencesBackups.nameAlreadyExists({ name }), | ||||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -386,8 +385,8 @@ async function rename(id: string): Promise<void> { | |||
| 
 | ||||
| 	const { canceled: cancel2 } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		title: ts.rename, | ||||
| 		text: t('_preferencesBackups.renameConfirm', { old: registry.name, new: name }), | ||||
| 		title: i18n.ts.rename, | ||||
| 		text: i18n.tsx._preferencesBackups.renameConfirm({ old: registry.name, new: name }), | ||||
| 	}); | ||||
| 	if (cancel2) return; | ||||
| 
 | ||||
|  | @ -399,25 +398,25 @@ function menu(ev: MouseEvent, profileId: string) { | |||
| 	if (!profiles.value) return; | ||||
| 
 | ||||
| 	return os.popupMenu([{ | ||||
| 		text: ts._preferencesBackups.apply, | ||||
| 		text: i18n.ts._preferencesBackups.apply, | ||||
| 		icon: 'ti ti-check', | ||||
| 		action: () => applyProfile(profileId), | ||||
| 	}, { | ||||
| 		type: 'a', | ||||
| 		text: ts.download, | ||||
| 		text: i18n.ts.download, | ||||
| 		icon: 'ti ti-download', | ||||
| 		href: URL.createObjectURL(new Blob([JSON.stringify(profiles.value[profileId], null, 2)], { type: 'application/json' })), | ||||
| 		download: `${profiles.value[profileId].name}.json`, | ||||
| 	}, { type: 'divider' }, { | ||||
| 		text: ts.rename, | ||||
| 		text: i18n.ts.rename, | ||||
| 		icon: 'ti ti-forms', | ||||
| 		action: () => rename(profileId), | ||||
| 	}, { | ||||
| 		text: ts._preferencesBackups.save, | ||||
| 		text: i18n.ts._preferencesBackups.save, | ||||
| 		icon: 'ti ti-device-floppy', | ||||
| 		action: () => save(profileId), | ||||
| 	}, { type: 'divider' }, { | ||||
| 		text: ts.delete, | ||||
| 		text: i18n.ts.delete, | ||||
| 		icon: 'ti ti-trash', | ||||
| 		action: () => deleteProfile(profileId), | ||||
| 		danger: true, | ||||
|  | @ -439,7 +438,7 @@ onUnmounted(() => { | |||
| }); | ||||
| 
 | ||||
| definePageMetadata(() => ({ | ||||
| 	title: ts.preferencesBackups, | ||||
| 	title: i18n.ts.preferencesBackups, | ||||
| 	icon: 'ti ti-device-floppy', | ||||
| })); | ||||
| </script> | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { getHighlighterCore, loadWasm } from 'shiki/core'; | ||||
| import { createHighlighterCore, loadWasm } from 'shiki/core'; | ||||
| import darkPlus from 'shiki/themes/dark-plus.mjs'; | ||||
| import { bundledThemesInfo } from 'shiki/themes'; | ||||
| import { bundledLanguagesInfo } from 'shiki/langs'; | ||||
|  | @ -69,7 +69,7 @@ async function initHighlighter() { | |||
| 	]); | ||||
| 
 | ||||
| 	const jsLangInfo = bundledLanguagesInfo.find(t => t.id === 'javascript'); | ||||
| 	const highlighter = await getHighlighterCore({ | ||||
| 	const highlighter = await createHighlighterCore({ | ||||
| 		themes, | ||||
| 		langs: [ | ||||
| 			...(jsLangInfo ? [async () => await jsLangInfo.import()] : []), | ||||
|  |  | |||
|  | @ -246,8 +246,8 @@ importers: | |||
|         specifier: 14.4.2 | ||||
|         version: 14.4.2 | ||||
|       happy-dom: | ||||
|         specifier: 10.0.3 | ||||
|         version: 10.0.3 | ||||
|         specifier: 15.6.1 | ||||
|         version: 15.6.1 | ||||
|       hpagent: | ||||
|         specifier: 1.2.0 | ||||
|         version: 1.2.0 | ||||
|  | @ -7782,6 +7782,10 @@ packages: | |||
|   happy-dom@10.0.3: | ||||
|     resolution: {integrity: sha512-WkCP+Z5fX6U5PY+yHP3ElV5D9PoxRAHRWPFq3pG9rg/6Hjf5ak7dozAgSCywsTRUq2qfa8vV8OQvUy5pRXy8EQ==} | ||||
| 
 | ||||
|   happy-dom@15.6.1: | ||||
|     resolution: {integrity: sha512-dsMHLsJHZYhXeExP47B2siAfKNVxptlwFss3/bq/9sG3iBt0P2WYFBq68JgMR5vB5gsN2Ev0feTTPD/+rosUNQ==} | ||||
|     engines: {node: '>=18.0.0'} | ||||
| 
 | ||||
|   har-schema@2.0.0: | ||||
|     resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} | ||||
|     engines: {node: '>=4'} | ||||
|  | @ -20289,6 +20293,12 @@ snapshots: | |||
|       whatwg-encoding: 2.0.0 | ||||
|       whatwg-mimetype: 3.0.0 | ||||
| 
 | ||||
|   happy-dom@15.6.1: | ||||
|     dependencies: | ||||
|       entities: 4.5.0 | ||||
|       webidl-conversions: 7.0.0 | ||||
|       whatwg-mimetype: 3.0.0 | ||||
| 
 | ||||
|   har-schema@2.0.0: {} | ||||
| 
 | ||||
|   har-validator@5.1.5: | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue