mirror of
https://github.com/black-ant/Ant-Browser.git
synced 2026-07-14 18:48:55 +08:00
181 lines
6.1 KiB
Go
181 lines
6.1 KiB
Go
package backend
|
|
|
|
import (
|
|
"ant-chrome/backend/internal/browser"
|
|
"ant-chrome/backend/internal/config"
|
|
"ant-chrome/backend/internal/logger"
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
wailsruntime "github.com/wailsapp/wails/v2/pkg/runtime"
|
|
)
|
|
|
|
func (a *App) GetBrowserSettings() BrowserSettings {
|
|
return BrowserSettings{
|
|
UserDataRoot: a.config.Browser.UserDataRoot,
|
|
DefaultFingerprintArgs: append([]string{}, a.config.Browser.DefaultFingerprintArgs...),
|
|
DefaultLaunchArgs: append([]string{}, a.config.Browser.DefaultLaunchArgs...),
|
|
DefaultStartURLs: append([]string{}, a.config.Browser.DefaultStartURLs...),
|
|
LightStartEnabled: browserLightStartEnabled(a.config),
|
|
RestoreLastSession: a.config.Browser.RestoreLastSession,
|
|
StartReadyTimeoutMs: browserStartReadyTimeoutMillis(a.config),
|
|
StartStableWindowMs: browserStartStableWindowMillis(a.config),
|
|
DefaultConnectorType: config.NormalizeBrowserConnectorType(a.config.Browser.DefaultConnectorType),
|
|
}
|
|
}
|
|
|
|
func (a *App) SaveBrowserSettings(settings BrowserSettings) error {
|
|
log := logger.New("Browser")
|
|
a.config.Browser.UserDataRoot = strings.TrimSpace(settings.UserDataRoot)
|
|
a.config.Browser.DefaultFingerprintArgs = append([]string{}, settings.DefaultFingerprintArgs...)
|
|
a.config.Browser.DefaultLaunchArgs = append([]string{}, settings.DefaultLaunchArgs...)
|
|
if settings.DefaultStartURLs != nil {
|
|
a.config.Browser.DefaultStartURLs = normalizeNonEmptyStrings(settings.DefaultStartURLs)
|
|
} else if a.config.Browser.DefaultStartURLs == nil {
|
|
a.config.Browser.DefaultStartURLs = config.DefaultBrowserStartURLs()
|
|
}
|
|
lightStartEnabled := settings.LightStartEnabled
|
|
a.config.Browser.LightStartEnabled = &lightStartEnabled
|
|
a.config.Browser.RestoreLastSession = settings.RestoreLastSession
|
|
a.config.Browser.DefaultConnectorType = config.NormalizeBrowserConnectorType(settings.DefaultConnectorType)
|
|
if settings.StartReadyTimeoutMs > 0 {
|
|
a.config.Browser.StartReadyTimeoutMs = settings.StartReadyTimeoutMs
|
|
} else if a.config.Browser.StartReadyTimeoutMs <= 0 {
|
|
a.config.Browser.StartReadyTimeoutMs = browserStartReadyTimeoutMillis(nil)
|
|
}
|
|
if settings.StartStableWindowMs > 0 {
|
|
a.config.Browser.StartStableWindowMs = settings.StartStableWindowMs
|
|
} else if a.config.Browser.StartStableWindowMs <= 0 {
|
|
a.config.Browser.StartStableWindowMs = browserStartStableWindowMillis(nil)
|
|
}
|
|
if err := a.config.Save(a.resolveAppPath("config.yaml")); err != nil {
|
|
log.Error("浏览器配置保存失败", logger.F("error", err))
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a *App) BrowserCoreList() []BrowserCore {
|
|
return a.browserMgr.ListCores()
|
|
}
|
|
|
|
func (a *App) BrowserCoreSave(input BrowserCoreInput) error {
|
|
return a.browserMgr.SaveCore(input)
|
|
}
|
|
|
|
func (a *App) BrowserCoreDelete(coreId string) error {
|
|
return a.browserMgr.DeleteCore(coreId)
|
|
}
|
|
|
|
func (a *App) BrowserCoreSetDefault(coreId string) error {
|
|
return a.browserMgr.SetDefaultCore(coreId)
|
|
}
|
|
|
|
func (a *App) BrowserCoreValidate(corePath string) BrowserCoreValidateResult {
|
|
return a.browserMgr.ValidateCorePath(corePath)
|
|
}
|
|
|
|
func (a *App) BrowserCoreExtendedInfo() []BrowserCoreExtendedInfo {
|
|
return a.browserMgr.GetCoresExtendedInfo()
|
|
}
|
|
|
|
// BrowserCoreScan 重新扫描 chrome 目录,自动注册新内核
|
|
func (a *App) BrowserCoreScan() []BrowserCore {
|
|
a.autoDetectCores()
|
|
return a.browserMgr.ListCores()
|
|
}
|
|
|
|
// BrowserCoreImportLocal 选择一个已解压内核目录并直接注册,不下载、不复制文件。
|
|
func (a *App) BrowserCoreImportLocal() (*BrowserCore, error) {
|
|
if a.ctx == nil {
|
|
return nil, fmt.Errorf("app context is nil")
|
|
}
|
|
if a.browserMgr == nil {
|
|
return nil, fmt.Errorf("browser manager is nil")
|
|
}
|
|
|
|
selectedDir, err := wailsruntime.OpenDirectoryDialog(a.ctx, wailsruntime.OpenDialogOptions{
|
|
Title: "选择已解压的 Chrome 内核目录",
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
selectedDir = strings.TrimSpace(selectedDir)
|
|
if selectedDir == "" {
|
|
return nil, nil
|
|
}
|
|
|
|
absDir, err := filepath.Abs(selectedDir)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if _, _, ok := browser.FindCoreExecutable(absDir); !ok {
|
|
return nil, fmt.Errorf("所选目录不是有效内核目录:未找到浏览器可执行文件(候选:%s)", strings.Join(browser.CoreExecutableCandidates(), ", "))
|
|
}
|
|
|
|
corePath := a.relativeCorePathIfPossible(absDir)
|
|
coreName := strings.TrimSpace(filepath.Base(absDir))
|
|
if coreName == "" || coreName == "." || coreName == string(filepath.Separator) {
|
|
coreName = "本地内核"
|
|
}
|
|
|
|
for _, existing := range a.browserMgr.ListCores() {
|
|
if normalizeCorePathForCompare(existing.CorePath) == normalizeCorePathForCompare(corePath) {
|
|
return &existing, nil
|
|
}
|
|
}
|
|
|
|
input := browser.CoreInput{
|
|
CoreName: coreName,
|
|
CorePath: corePath,
|
|
IsDefault: len(a.browserMgr.ListCores()) == 0,
|
|
}
|
|
if err := a.browserMgr.SaveCore(input); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, saved := range a.browserMgr.ListCores() {
|
|
if normalizeCorePathForCompare(saved.CorePath) == normalizeCorePathForCompare(corePath) {
|
|
return &saved, nil
|
|
}
|
|
}
|
|
return nil, fmt.Errorf("本地内核已保存但未能读取结果")
|
|
}
|
|
|
|
func (a *App) relativeCorePathIfPossible(absDir string) string {
|
|
for _, root := range []string{a.appRootAbs(), a.appStateRootAbs()} {
|
|
root = strings.TrimSpace(root)
|
|
if root == "" {
|
|
continue
|
|
}
|
|
rootAbs, err := filepath.Abs(root)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
rel, err := filepath.Rel(rootAbs, absDir)
|
|
if err == nil && rel != "." && rel != ".." && !strings.HasPrefix(filepath.ToSlash(rel), "../") && !filepath.IsAbs(rel) {
|
|
return filepath.ToSlash(rel)
|
|
}
|
|
}
|
|
return absDir
|
|
}
|
|
|
|
// BrowserCoreDownload 在线下载并自动解压配置内核
|
|
func (a *App) BrowserCoreDownload(coreName, url, proxyConfig string) error {
|
|
if a.ctx == nil {
|
|
return fmt.Errorf("app context is nil")
|
|
}
|
|
go a.browserMgr.DownloadAndExtractCore(a.ctx, coreName, url, proxyConfig)
|
|
return nil
|
|
}
|
|
|
|
// BrowserCoreRedownload 重新下载并替换指定内核目录
|
|
func (a *App) BrowserCoreRedownload(coreId, url, proxyConfig string) error {
|
|
if a.ctx == nil {
|
|
return fmt.Errorf("app context is nil")
|
|
}
|
|
go a.browserMgr.RedownloadCore(a.ctx, coreId, url, proxyConfig)
|
|
return nil
|
|
}
|