Skip to content

Commit 1231392

Browse files
committed
fix(desktop): open links in system browser
1 parent 19d9ebb commit 1231392

3 files changed

Lines changed: 3 additions & 52 deletions

File tree

packages/web-shell/client/main.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
notifyOpenWorkTurnComplete,
2424
OpenWorkDesktopLayer,
2525
OpenWorkWelcomeFooter,
26-
openInOpenWorkBrowser,
2726
recordOpenWorkSession,
2827
} from './openwork/OpenWorkDesktopLayer';
2928
import 'katex/dist/katex.min.css';
@@ -227,9 +226,6 @@ export function StandaloneApp({ daemonToken }: { daemonToken?: string }) {
227226
},
228227
compactThinking: true,
229228
markdownTableMode: 'advanced',
230-
markdown: {
231-
onOpenLink: openInOpenWorkBrowser,
232-
},
233229
renderWelcomeFooter: () => (
234230
<OpenWorkWelcomeFooter composerRef={composerRef} />
235231
),

packages/web-shell/client/openwork/OpenWorkDesktopLayer.test.ts

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,9 @@
11
/** @vitest-environment jsdom */
22

3-
import { afterEach, describe, expect, it, vi } from 'vitest';
4-
import {
5-
drainOpenWorkDeepLinks,
6-
openInOpenWorkBrowser,
7-
} from './OpenWorkDesktopLayer';
8-
9-
describe('OpenWork browser links', () => {
10-
afterEach(() => {
11-
delete (window as Window & { __TAURI__?: unknown }).__TAURI__;
12-
});
13-
14-
it('only intercepts HTTP links in the Tauri desktop shell', () => {
15-
expect(openInOpenWorkBrowser('https://qwen.ai/docs')).toBe(false);
16-
17-
(window as Window & { __TAURI__?: unknown }).__TAURI__ = {
18-
core: { invoke: vi.fn() },
19-
};
20-
const opened: string[] = [];
21-
window.addEventListener(
22-
'openwork:open-browser',
23-
(event) => opened.push((event as CustomEvent<string>).detail),
24-
{ once: true },
25-
);
26-
27-
expect(openInOpenWorkBrowser('mailto:help@qwen.ai')).toBe(false);
28-
expect(openInOpenWorkBrowser('https://user:secret@qwen.ai')).toBe(false);
29-
expect(openInOpenWorkBrowser('https://qwen.ai/docs')).toBe(true);
30-
expect(opened).toEqual(['https://qwen.ai/docs']);
31-
});
3+
import { describe, expect, it, vi } from 'vitest';
4+
import { drainOpenWorkDeepLinks } from './OpenWorkDesktopLayer';
325

6+
describe('OpenWork desktop layer', () => {
337
it('processes concurrent deep-link drains exactly once', async () => {
348
const pending = ['openwork://new', 'openwork://session/session-1'];
359
const take = vi.fn(async () => pending.splice(0));

packages/web-shell/client/openwork/OpenWorkDesktopLayer.tsx

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -223,25 +223,6 @@ export async function drainOpenWorkDeepLinks(
223223
(await take())?.forEach(open);
224224
}
225225

226-
export function openInOpenWorkBrowser(url: string): boolean {
227-
let safe = false;
228-
try {
229-
const parsed = new URL(url);
230-
safe =
231-
(parsed.protocol === 'http:' || parsed.protocol === 'https:') &&
232-
Boolean(parsed.hostname) &&
233-
!parsed.username &&
234-
!parsed.password;
235-
} catch {
236-
// Fall through to the host's normal link handling.
237-
}
238-
if (!safe || !tauri()?.core?.invoke) return false;
239-
window.dispatchEvent(
240-
new CustomEvent('openwork:open-browser', { detail: url }),
241-
);
242-
return true;
243-
}
244-
245226
export function notifyOpenWorkTurnComplete(): void {
246227
void invokeOpenWork('notify_turn_complete', {
247228
title: 'OpenWork',

0 commit comments

Comments
 (0)