Support force internal navigation parameter
This commit is contained in:
8
bin/cli.ts
vendored
8
bin/cli.ts
vendored
@@ -174,6 +174,14 @@ program
|
|||||||
.default(DEFAULT.startToTray)
|
.default(DEFAULT.startToTray)
|
||||||
.hideHelp(),
|
.hideHelp(),
|
||||||
)
|
)
|
||||||
|
.addOption(
|
||||||
|
new Option(
|
||||||
|
'--force-internal-navigation',
|
||||||
|
'Keep every link inside the Pake window instead of opening external handlers',
|
||||||
|
)
|
||||||
|
.default(DEFAULT.forceInternalNavigation)
|
||||||
|
.hideHelp(),
|
||||||
|
)
|
||||||
.addOption(
|
.addOption(
|
||||||
new Option('--installer-language <string>', 'Installer language')
|
new Option('--installer-language <string>', 'Installer language')
|
||||||
.default(DEFAULT.installerLanguage)
|
.default(DEFAULT.installerLanguage)
|
||||||
|
|||||||
1
bin/defaults.ts
vendored
1
bin/defaults.ts
vendored
@@ -30,6 +30,7 @@ export const DEFAULT_PAKE_OPTIONS: PakeCliOptions = {
|
|||||||
keepBinary: false,
|
keepBinary: false,
|
||||||
multiInstance: false,
|
multiInstance: false,
|
||||||
startToTray: false,
|
startToTray: false,
|
||||||
|
forceInternalNavigation: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Just for cli development
|
// Just for cli development
|
||||||
|
|||||||
2
bin/helpers/merge.ts
vendored
2
bin/helpers/merge.ts
vendored
@@ -73,6 +73,7 @@ export async function mergeConfig(
|
|||||||
enableDragDrop,
|
enableDragDrop,
|
||||||
multiInstance,
|
multiInstance,
|
||||||
startToTray,
|
startToTray,
|
||||||
|
forceInternalNavigation,
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
const { platform } = process;
|
const { platform } = process;
|
||||||
@@ -96,6 +97,7 @@ export async function mergeConfig(
|
|||||||
enable_wasm: wasm,
|
enable_wasm: wasm,
|
||||||
enable_drag_drop: enableDragDrop,
|
enable_drag_drop: enableDragDrop,
|
||||||
start_to_tray: startToTray && showSystemTray,
|
start_to_tray: startToTray && showSystemTray,
|
||||||
|
force_internal_navigation: forceInternalNavigation,
|
||||||
};
|
};
|
||||||
Object.assign(tauriConf.pake.windows[0], { url, ...tauriConfWindowOptions });
|
Object.assign(tauriConf.pake.windows[0], { url, ...tauriConfWindowOptions });
|
||||||
|
|
||||||
|
|||||||
3
bin/types.ts
vendored
3
bin/types.ts
vendored
@@ -96,6 +96,9 @@ export interface PakeCliOptions {
|
|||||||
|
|
||||||
// Start app minimized to tray, default false
|
// Start app minimized to tray, default false
|
||||||
startToTray: boolean;
|
startToTray: boolean;
|
||||||
|
|
||||||
|
// Force navigation to stay inside the Pake window even for external links
|
||||||
|
forceInternalNavigation: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PakeAppOptions extends PakeCliOptions {
|
export interface PakeAppOptions extends PakeCliOptions {
|
||||||
|
|||||||
8
docs/cli-usage.md
vendored
8
docs/cli-usage.md
vendored
@@ -204,6 +204,14 @@ Sets whether to disable web shortcuts in the original Pake container, defaults t
|
|||||||
--disabled-web-shortcuts
|
--disabled-web-shortcuts
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### [force-internal-navigation]
|
||||||
|
|
||||||
|
Keeps every clicked link (even pointing to other domains) inside the Pake window instead of letting the OS open an external browser or helper. Default is `false`.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
--force-internal-navigation
|
||||||
|
```
|
||||||
|
|
||||||
#### [multi-arch]
|
#### [multi-arch]
|
||||||
|
|
||||||
Package the application to support both Intel and M1 chips, exclusively for macOS. Default is `false`.
|
Package the application to support both Intel and M1 chips, exclusively for macOS. Default is `false`.
|
||||||
|
|||||||
8
docs/cli-usage_CN.md
vendored
8
docs/cli-usage_CN.md
vendored
@@ -202,6 +202,14 @@ pake https://github.com --name GitHub
|
|||||||
--disabled-web-shortcuts
|
--disabled-web-shortcuts
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### [force-internal-navigation]
|
||||||
|
|
||||||
|
启用后所有点击的链接(即使是跨域)都会在 Pake 窗口内打开,不会再调用外部浏览器或辅助程序。默认 `false`。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
--force-internal-navigation
|
||||||
|
```
|
||||||
|
|
||||||
#### [multi-arch]
|
#### [multi-arch]
|
||||||
|
|
||||||
设置打包结果同时支持 Intel 和 M1 芯片,仅适用于 macOS,默认为 `false`。
|
设置打包结果同时支持 Intel 和 M1 芯片,仅适用于 macOS,默认为 `false`。
|
||||||
|
|||||||
3
src-tauri/pake.json
vendored
3
src-tauri/pake.json
vendored
@@ -17,7 +17,8 @@
|
|||||||
"enable_wasm": false,
|
"enable_wasm": false,
|
||||||
"enable_drag_drop": false,
|
"enable_drag_drop": false,
|
||||||
"maximize": false,
|
"maximize": false,
|
||||||
"start_to_tray": false
|
"start_to_tray": false,
|
||||||
|
"force_internal_navigation": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"user_agent": {
|
"user_agent": {
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ pub struct WindowConfig {
|
|||||||
pub enable_wasm: bool,
|
pub enable_wasm: bool,
|
||||||
pub enable_drag_drop: bool,
|
pub enable_drag_drop: bool,
|
||||||
pub start_to_tray: bool,
|
pub start_to_tray: bool,
|
||||||
|
#[serde(default)]
|
||||||
|
pub force_internal_navigation: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
|||||||
24
src-tauri/src/inject/event.js
vendored
24
src-tauri/src/inject/event.js
vendored
@@ -192,6 +192,8 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
const tauri = window.__TAURI__;
|
const tauri = window.__TAURI__;
|
||||||
const appWindow = tauri.window.getCurrentWindow();
|
const appWindow = tauri.window.getCurrentWindow();
|
||||||
const invoke = tauri.core.invoke;
|
const invoke = tauri.core.invoke;
|
||||||
|
const pakeConfig = window["pakeConfig"] || {};
|
||||||
|
const forceInternalNavigation = pakeConfig.force_internal_navigation === true;
|
||||||
|
|
||||||
if (!document.getElementById("pake-top-dom")) {
|
if (!document.getElementById("pake-top-dom")) {
|
||||||
const topDom = document.createElement("div");
|
const topDom = document.createElement("div");
|
||||||
@@ -394,9 +396,15 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
|
|
||||||
// Handle _blank links: same domain navigates in-app, cross-domain opens new window
|
// Handle _blank links: same domain navigates in-app, cross-domain opens new window
|
||||||
if (target === "_blank") {
|
if (target === "_blank") {
|
||||||
|
if (forceInternalNavigation) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
window.location.href = absoluteUrl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (isSameDomain(absoluteUrl)) {
|
if (isSameDomain(absoluteUrl)) {
|
||||||
// For same-domain links, let the browser/SPA handle it naturally
|
// For same-domain links, let the browser handle it naturally
|
||||||
// This prevents full page reload in SPA apps like Discord
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,6 +421,10 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (target === "_new") {
|
if (target === "_new") {
|
||||||
|
if (forceInternalNavigation) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
handleExternalLink(absoluteUrl);
|
handleExternalLink(absoluteUrl);
|
||||||
return;
|
return;
|
||||||
@@ -435,6 +447,10 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
// Handle regular links: same domain allows normal navigation, cross-domain opens new window
|
// Handle regular links: same domain allows normal navigation, cross-domain opens new window
|
||||||
if (!target || target === "_self") {
|
if (!target || target === "_self") {
|
||||||
if (!isSameDomain(absoluteUrl)) {
|
if (!isSameDomain(absoluteUrl)) {
|
||||||
|
if (forceInternalNavigation) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopImmediatePropagation();
|
e.stopImmediatePropagation();
|
||||||
const newWindow = originalWindowOpen.call(
|
const newWindow = originalWindowOpen.call(
|
||||||
@@ -468,6 +484,10 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
const absoluteUrl = hrefUrl.href;
|
const absoluteUrl = hrefUrl.href;
|
||||||
|
|
||||||
if (!isSameDomain(absoluteUrl)) {
|
if (!isSameDomain(absoluteUrl)) {
|
||||||
|
if (forceInternalNavigation) {
|
||||||
|
return originalWindowOpen.call(window, absoluteUrl, name, specs);
|
||||||
|
}
|
||||||
|
|
||||||
handleExternalLink(absoluteUrl);
|
handleExternalLink(absoluteUrl);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user