feat: refresh and edit browser instances
This commit is contained in:
+91
-1
@@ -109,14 +109,20 @@ func runWindow(logger *slog.Logger) {
|
||||
discoverer := browser.NewDiscoverer()
|
||||
launcher := browser.NewOSLauncher()
|
||||
cdp := browser.NewCDPInspector()
|
||||
externalProfiles := browser.NewWindowsProfileInspector()
|
||||
shell.OnStartInstance(instanceStarter{
|
||||
launcher: launcher,
|
||||
resolver: discoverer,
|
||||
managedProfiles: launcher,
|
||||
externalProfiles: browser.NewWindowsProfileInspector(),
|
||||
externalProfiles: externalProfiles,
|
||||
remoteDebug: cdp,
|
||||
portAllocator: cdp,
|
||||
}.Start, window.Invalidate)
|
||||
shell.OnRefreshInstances(instanceStatusRefresher{
|
||||
managedProfiles: launcher,
|
||||
externalProfiles: externalProfiles,
|
||||
remoteDebug: cdp,
|
||||
}.Refresh, window.Invalidate)
|
||||
shell.OnPathSearch(func(ctx context.Context, field ui.PathField, current string) (string, error) {
|
||||
switch field {
|
||||
case ui.PathChromeExecutable:
|
||||
@@ -207,6 +213,90 @@ type instanceStarter struct {
|
||||
portAllocator browser.RemoteDebugPortAllocator
|
||||
}
|
||||
|
||||
type instanceStatusRefresher struct {
|
||||
managedProfiles managedProfileInspector
|
||||
externalProfiles browser.ExternalProfileInspector
|
||||
remoteDebug browser.RemoteDebugEndpointInspector
|
||||
}
|
||||
|
||||
func (s instanceStatusRefresher) Refresh(ctx context.Context, rows []ui.InstanceRow) ([]ui.InstanceRefreshResult, error) {
|
||||
results := make([]ui.InstanceRefreshResult, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return results, err
|
||||
}
|
||||
results = append(results, s.refreshOne(ctx, row))
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (s instanceStatusRefresher) refreshOne(ctx context.Context, row ui.InstanceRow) ui.InstanceRefreshResult {
|
||||
result := ui.InstanceRefreshResult{ID: row.ID, Status: "已退出"}
|
||||
kind, err := browserKind(row.Browser)
|
||||
if err != nil {
|
||||
result.Status = "未知占用"
|
||||
result.Message = "浏览器类型无效,无法刷新实例状态。"
|
||||
return result
|
||||
}
|
||||
if s.managedProfiles != nil {
|
||||
use, inspectErr := s.managedProfiles.InspectProfile(ctx, row.UserDataDir)
|
||||
if inspectErr != nil {
|
||||
result.Status = "未知占用"
|
||||
result.Message = "无法检查 Chub 托管实例状态。"
|
||||
return result
|
||||
}
|
||||
if use.Occupied {
|
||||
result.Status = "运行中"
|
||||
result.PID = use.PID
|
||||
result.OccupancySource = use.Source
|
||||
if s.remoteDebug == nil || row.RemoteDebugPort <= 0 {
|
||||
result.Status = "运行中(调试不可用)"
|
||||
result.Message = "未记录可验证的本地调试端口。"
|
||||
return result
|
||||
}
|
||||
endpoint, endpointErr := s.remoteDebug.InspectRemoteDebugPort(ctx, kind, row.RemoteDebugPort)
|
||||
if endpointErr != nil {
|
||||
result.Status = "运行中(调试不可用)"
|
||||
result.Message = "本地调试端点当前不可用。"
|
||||
return result
|
||||
}
|
||||
result.RemoteDebugPort = endpoint.Port
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
var externalUse browser.ProfileUse
|
||||
if s.externalProfiles != nil {
|
||||
use, inspectErr := s.externalProfiles.InspectProfile(ctx, kind, row.UserDataDir, row.PID)
|
||||
if inspectErr != nil {
|
||||
result.Status = "未知占用"
|
||||
result.Message = "无法检查外部浏览器占用状态。"
|
||||
return result
|
||||
}
|
||||
externalUse = use
|
||||
}
|
||||
if s.remoteDebug != nil {
|
||||
endpoint, endpointErr := s.remoteDebug.InspectRemoteDebugEndpoint(ctx, kind, row.UserDataDir)
|
||||
if endpointErr == nil {
|
||||
result.Status = "外部已关联"
|
||||
result.PID = externalUse.PID
|
||||
result.RemoteDebugPort = endpoint.Port
|
||||
result.OccupancySource = externalUse.Source
|
||||
if result.OccupancySource == "" {
|
||||
result.OccupancySource = "devtools_active_port"
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
if externalUse.Occupied {
|
||||
result.Status = "外部占用"
|
||||
result.PID = externalUse.PID
|
||||
result.OccupancySource = externalUse.Source
|
||||
return result
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (s instanceStarter) Start(ctx context.Context, row ui.InstanceRow, settings ui.SettingsState) (ui.InstanceStartOutcome, error) {
|
||||
kind, err := browserKind(row.Browser)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user