mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-06-10 12:10:53 +00:00
7d211fa796
Pure cut-and-paste of functions/methods into separate files within the same package — no logic changes. Reduces file sizes for readability. - loop.go (1312→856) → loop_types.go, loop_compact.go, loop_media.go, loop_utils.go - delegate.go (687→171) → delegate_sync.go, delegate_async.go, delegate_prep.go - browser.go (605→154) → browser_tabs.go, browser_page.go, browser_remote.go - teams.go (602→170) → teams_crud.go, teams_members.go - web_fetch_convert.go (572→176) → web_fetch_convert_handlers.go, web_fetch_convert_utils.go - resolver.go (543→373) → resolver_helpers.go - sessions.go (536→157) → sessions_tokens.go, sessions_ops.go, sessions_list.go Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package browser
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/go-rod/rod/lib/proto"
|
|
)
|
|
|
|
// Snapshot takes an accessibility snapshot of a page.
|
|
func (m *Manager) Snapshot(ctx context.Context, targetID string, opts SnapshotOptions) (*SnapshotResult, error) {
|
|
m.mu.Lock()
|
|
page, err := m.getPage(targetID)
|
|
m.mu.Unlock()
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result, err := proto.AccessibilityGetFullAXTree{}.Call(page)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get AX tree: %w", err)
|
|
}
|
|
|
|
snap := FormatSnapshot(result.Nodes, opts)
|
|
info, _ := page.Info()
|
|
snap.TargetID = targetID
|
|
if info != nil {
|
|
snap.URL = info.URL
|
|
snap.Title = info.Title
|
|
}
|
|
|
|
// Cache refs
|
|
m.refs.Store(targetID, snap.Refs)
|
|
|
|
return snap, nil
|
|
}
|
|
|
|
// Screenshot captures a page screenshot as PNG bytes.
|
|
func (m *Manager) Screenshot(ctx context.Context, targetID string, fullPage bool) ([]byte, error) {
|
|
m.mu.Lock()
|
|
page, err := m.getPage(targetID)
|
|
m.mu.Unlock()
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if fullPage {
|
|
return page.Screenshot(fullPage, &proto.PageCaptureScreenshot{
|
|
Format: proto.PageCaptureScreenshotFormatPng,
|
|
})
|
|
}
|
|
return page.Screenshot(false, nil)
|
|
}
|
|
|
|
// Navigate navigates a page to a URL.
|
|
func (m *Manager) Navigate(ctx context.Context, targetID, url string) error {
|
|
m.mu.Lock()
|
|
page, err := m.getPage(targetID)
|
|
m.mu.Unlock()
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := page.Navigate(url); err != nil {
|
|
return fmt.Errorf("navigate: %w", err)
|
|
}
|
|
if err := page.WaitStable(300 * time.Millisecond); err != nil {
|
|
return fmt.Errorf("wait stable after navigate: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Close shuts down the browser if running.
|
|
func (m *Manager) Close() error {
|
|
return m.Stop(context.Background())
|
|
}
|
|
|
|
// Refs returns the RefStore for external use (e.g. actions).
|
|
func (m *Manager) Refs() *RefStore {
|
|
return m.refs
|
|
}
|