mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-05-11 08:12:38 +02:00
default search
This commit is contained in:
parent
884d8601cd
commit
042ffc3410
3 changed files with 37 additions and 44 deletions
|
|
@ -2,40 +2,7 @@ import { BrowserWindow } from 'electron';
|
||||||
import type { IBrowserControlService } from '@x/core/dist/application/browser-control/service.js';
|
import type { IBrowserControlService } from '@x/core/dist/application/browser-control/service.js';
|
||||||
import type { BrowserControlAction, BrowserControlInput, BrowserControlResult } from '@x/shared/dist/browser-control.js';
|
import type { BrowserControlAction, BrowserControlInput, BrowserControlResult } from '@x/shared/dist/browser-control.js';
|
||||||
import { browserViewManager } from './view.js';
|
import { browserViewManager } from './view.js';
|
||||||
|
import { normalizeNavigationTarget } from './navigation.js';
|
||||||
const SEARCH_ENGINE_BASE_URL = 'https://www.google.com/search?q=';
|
|
||||||
|
|
||||||
function normalizeNavigationTarget(target: string): string {
|
|
||||||
const trimmed = target.trim();
|
|
||||||
if (!trimmed) {
|
|
||||||
throw new Error('Navigation target cannot be empty.');
|
|
||||||
}
|
|
||||||
|
|
||||||
const lower = trimmed.toLowerCase();
|
|
||||||
if (
|
|
||||||
lower.startsWith('javascript:')
|
|
||||||
|| lower.startsWith('file://')
|
|
||||||
|| lower.startsWith('chrome://')
|
|
||||||
|| lower.startsWith('chrome-extension://')
|
|
||||||
) {
|
|
||||||
throw new Error('That URL scheme is not allowed in the embedded browser.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {
|
|
||||||
return trimmed;
|
|
||||||
}
|
|
||||||
|
|
||||||
const looksLikeHost =
|
|
||||||
trimmed.startsWith('localhost')
|
|
||||||
|| /^[\w.-]+\.[a-z]{2,}/i.test(trimmed)
|
|
||||||
|| /^\d{1,3}(?:\.\d{1,3}){3}(?::\d+)?(?:\/.*)?$/.test(trimmed);
|
|
||||||
|
|
||||||
if (looksLikeHost && !/\s/.test(trimmed)) {
|
|
||||||
return trimmed;
|
|
||||||
}
|
|
||||||
|
|
||||||
return `${SEARCH_ENGINE_BASE_URL}${encodeURIComponent(trimmed)}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function emitPaneState(open: boolean): void {
|
function emitPaneState(open: boolean): void {
|
||||||
const windows = BrowserWindow.getAllWindows();
|
const windows = BrowserWindow.getAllWindows();
|
||||||
|
|
|
||||||
33
apps/x/apps/main/src/browser/navigation.ts
Normal file
33
apps/x/apps/main/src/browser/navigation.ts
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
const SEARCH_ENGINE_BASE_URL = 'https://www.google.com/search?q=';
|
||||||
|
|
||||||
|
export function normalizeNavigationTarget(target: string): string {
|
||||||
|
const trimmed = target.trim();
|
||||||
|
if (!trimmed) {
|
||||||
|
throw new Error('Navigation target cannot be empty.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const lower = trimmed.toLowerCase();
|
||||||
|
if (
|
||||||
|
lower.startsWith('javascript:')
|
||||||
|
|| lower.startsWith('file://')
|
||||||
|
|| lower.startsWith('chrome://')
|
||||||
|
|| lower.startsWith('chrome-extension://')
|
||||||
|
) {
|
||||||
|
throw new Error('That URL scheme is not allowed in the embedded browser.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
const looksLikeHost =
|
||||||
|
trimmed.startsWith('localhost')
|
||||||
|
|| /^[\w.-]+\.[a-z]{2,}/i.test(trimmed)
|
||||||
|
|| /^\d{1,3}(?:\.\d{1,3}){3}(?::\d+)?(?:\/.*)?$/.test(trimmed);
|
||||||
|
|
||||||
|
if (looksLikeHost && !/\s/.test(trimmed)) {
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${SEARCH_ENGINE_BASE_URL}${encodeURIComponent(trimmed)}`;
|
||||||
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ import type {
|
||||||
BrowserState,
|
BrowserState,
|
||||||
BrowserTabState,
|
BrowserTabState,
|
||||||
} from '@x/shared/dist/browser-control.js';
|
} from '@x/shared/dist/browser-control.js';
|
||||||
|
import { normalizeNavigationTarget } from './navigation.js';
|
||||||
|
|
||||||
export type { BrowserPageSnapshot, BrowserState, BrowserTabState };
|
export type { BrowserPageSnapshot, BrowserState, BrowserTabState };
|
||||||
|
|
||||||
|
|
@ -478,14 +479,6 @@ export class BrowserViewManager extends EventEmitter {
|
||||||
this.snapshotCache.delete(tabId);
|
this.snapshotCache.delete(tabId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private normalizeUrl(rawUrl: string): string {
|
|
||||||
let url = rawUrl.trim();
|
|
||||||
if (!/^[a-z][a-z0-9+.-]*:/i.test(url)) {
|
|
||||||
url = `https://${url}`;
|
|
||||||
}
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
private isEmbeddedTabUrl(url: string): boolean {
|
private isEmbeddedTabUrl(url: string): boolean {
|
||||||
return /^https?:\/\//i.test(url) || url === 'about:blank';
|
return /^https?:\/\//i.test(url) || url === 'about:blank';
|
||||||
}
|
}
|
||||||
|
|
@ -613,7 +606,7 @@ export class BrowserViewManager extends EventEmitter {
|
||||||
const targetUrl =
|
const targetUrl =
|
||||||
initialUrl === 'about:blank'
|
initialUrl === 'about:blank'
|
||||||
? HOME_URL
|
? HOME_URL
|
||||||
: this.normalizeUrl(initialUrl);
|
: normalizeNavigationTarget(initialUrl);
|
||||||
void tab.view.webContents.loadURL(targetUrl).catch(() => {
|
void tab.view.webContents.loadURL(targetUrl).catch(() => {
|
||||||
this.emitState();
|
this.emitState();
|
||||||
});
|
});
|
||||||
|
|
@ -792,7 +785,7 @@ export class BrowserViewManager extends EventEmitter {
|
||||||
try {
|
try {
|
||||||
const activeTab = this.getActiveTab() ?? this.ensureInitialTab();
|
const activeTab = this.getActiveTab() ?? this.ensureInitialTab();
|
||||||
this.invalidateSnapshot(activeTab.id);
|
this.invalidateSnapshot(activeTab.id);
|
||||||
await activeTab.view.webContents.loadURL(this.normalizeUrl(rawUrl));
|
await activeTab.view.webContents.loadURL(normalizeNavigationTarget(rawUrl));
|
||||||
return { ok: true };
|
return { ok: true };
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue