From ecfc76af5931c92a940400f7f680a958a2f88c95 Mon Sep 17 00:00:00 2001 From: lucaronin Date: Thu, 21 May 2026 10:19:49 +0200 Subject: [PATCH] fix: restore note window opening --- src/utils/openNoteWindow.test.ts | 27 ++++++++++++++++++++------- src/utils/openNoteWindow.ts | 18 +++++++++++++++++- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/utils/openNoteWindow.test.ts b/src/utils/openNoteWindow.test.ts index 7977ae0f..2c0bd27b 100644 --- a/src/utils/openNoteWindow.test.ts +++ b/src/utils/openNoteWindow.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import { buildNoteWindowUrl, openNoteInNewWindow } from './openNoteWindow' +import { buildNoteWindowUrl, buildRuntimeNoteWindowUrl, openNoteInNewWindow } from './openNoteWindow' import { isTauri } from '../mock-tauri' import { shouldUseLinuxWindowChrome } from './platform' @@ -38,6 +38,14 @@ vi.mock('@tauri-apps/api/dpi', () => ({ }, })) +function expectNoteWindowRoute(parsed: URL): void { + expect(parsed.pathname).toBe('/') + expect(parsed.searchParams.get('window')).toBe('note') + expect(parsed.searchParams.get('path')).toBe('/vault/Folder/My Note.md') + expect(parsed.searchParams.get('vault')).toBe('/Users/luca/Laputa Vault') + expect(parsed.searchParams.get('title')).toBe('AI / ML') +} + describe('openNoteWindow', () => { beforeEach(() => { vi.clearAllMocks() @@ -52,11 +60,15 @@ describe('openNoteWindow', () => { const url = buildNoteWindowUrl('/vault/Folder/My Note.md', '/Users/luca/Laputa Vault', 'AI / ML') const parsed = new URL(url, 'https://tolaria.localhost') - expect(parsed.pathname).toBe('/') - expect(parsed.searchParams.get('window')).toBe('note') - expect(parsed.searchParams.get('path')).toBe('/vault/Folder/My Note.md') - expect(parsed.searchParams.get('vault')).toBe('/Users/luca/Laputa Vault') - expect(parsed.searchParams.get('title')).toBe('AI / ML') + expectNoteWindowRoute(parsed) + }) + + it('resolves the runtime route against the current app origin', () => { + const url = buildRuntimeNoteWindowUrl('/vault/Folder/My Note.md', '/Users/luca/Laputa Vault', 'AI / ML') + const parsed = new URL(url) + + expect(parsed.origin).toBe(window.location.origin) + expectNoteWindowRoute(parsed) }) it('does nothing outside Tauri', async () => { @@ -69,11 +81,12 @@ describe('openNoteWindow', () => { vi.mocked(isTauri).mockReturnValue(true) await openNoteInNewWindow('/vault/Folder/My Note.md', '/Users/luca/Laputa Vault', 'AI / ML') + const expectedUrl = `${window.location.origin}/?window=note&path=%2Fvault%2FFolder%2FMy+Note.md&vault=%2FUsers%2Fluca%2FLaputa+Vault&title=AI+%2F+ML&windowLabel=note-1776182400000` expect(webviewWindowCalls).toHaveBeenCalledWith( 'note-1776182400000', expect.objectContaining({ - url: '/?window=note&path=%2Fvault%2FFolder%2FMy+Note.md&vault=%2FUsers%2Fluca%2FLaputa+Vault&title=AI+%2F+ML&windowLabel=note-1776182400000', + url: expectedUrl, title: 'AI / ML', width: 800, height: 700, diff --git a/src/utils/openNoteWindow.ts b/src/utils/openNoteWindow.ts index 12710182..4285b23b 100644 --- a/src/utils/openNoteWindow.ts +++ b/src/utils/openNoteWindow.ts @@ -3,6 +3,7 @@ import { shouldUseLinuxWindowChrome } from './platform' import { rememberNoteWindowParams } from './windowMode' const MACOS_TRAFFIC_LIGHT_POSITION = { x: 18, y: 24 } as const +const APP_ORIGIN_PROTOCOLS = new Set(['http:', 'https:']) export function buildNoteWindowUrl(notePath: string, vaultPath: string, noteTitle: string, windowLabel?: string): string { const params = new URLSearchParams({ @@ -19,6 +20,21 @@ export function buildNoteWindowUrl(notePath: string, vaultPath: string, noteTitl return `/?${params.toString()}` } +function resolveNoteWindowUrlForRuntime(route: string): string { + if (!APP_ORIGIN_PROTOCOLS.has(window.location.protocol)) return route + + return new URL(route, window.location.origin).toString() +} + +export function buildRuntimeNoteWindowUrl( + notePath: string, + vaultPath: string, + noteTitle: string, + windowLabel?: string, +): string { + return resolveNoteWindowUrlForRuntime(buildNoteWindowUrl(notePath, vaultPath, noteTitle, windowLabel)) +} + /** * Opens a note in a new Tauri window with a minimal editor-only layout. * In browser mode (non-Tauri), this is a no-op. @@ -32,7 +48,7 @@ export async function openNoteInNewWindow(notePath: string, vaultPath: string, n rememberNoteWindowParams(label, { notePath, vaultPath, noteTitle }) new WebviewWindow(label, { - url: buildNoteWindowUrl(notePath, vaultPath, noteTitle, label), + url: buildRuntimeNoteWindowUrl(notePath, vaultPath, noteTitle, label), title: noteTitle, width: 800, height: 700,