mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-05-11 16:22:40 +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 { BrowserControlAction, BrowserControlInput, BrowserControlResult } from '@x/shared/dist/browser-control.js';
|
||||
import { browserViewManager } from './view.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)}`;
|
||||
}
|
||||
import { normalizeNavigationTarget } from './navigation.js';
|
||||
|
||||
function emitPaneState(open: boolean): void {
|
||||
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,
|
||||
BrowserTabState,
|
||||
} from '@x/shared/dist/browser-control.js';
|
||||
import { normalizeNavigationTarget } from './navigation.js';
|
||||
|
||||
export type { BrowserPageSnapshot, BrowserState, BrowserTabState };
|
||||
|
||||
|
|
@ -478,14 +479,6 @@ export class BrowserViewManager extends EventEmitter {
|
|||
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 {
|
||||
return /^https?:\/\//i.test(url) || url === 'about:blank';
|
||||
}
|
||||
|
|
@ -613,7 +606,7 @@ export class BrowserViewManager extends EventEmitter {
|
|||
const targetUrl =
|
||||
initialUrl === 'about:blank'
|
||||
? HOME_URL
|
||||
: this.normalizeUrl(initialUrl);
|
||||
: normalizeNavigationTarget(initialUrl);
|
||||
void tab.view.webContents.loadURL(targetUrl).catch(() => {
|
||||
this.emitState();
|
||||
});
|
||||
|
|
@ -792,7 +785,7 @@ export class BrowserViewManager extends EventEmitter {
|
|||
try {
|
||||
const activeTab = this.getActiveTab() ?? this.ensureInitialTab();
|
||||
this.invalidateSnapshot(activeTab.id);
|
||||
await activeTab.view.webContents.loadURL(this.normalizeUrl(rawUrl));
|
||||
await activeTab.view.webContents.loadURL(normalizeNavigationTarget(rawUrl));
|
||||
return { ok: true };
|
||||
} catch (err) {
|
||||
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue