Files
goclaw/pkg/browser/browser_page.go
T
viettranx 7d211fa796 refactor: split 7 large Go files into smaller files per package
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>
2026-03-05 10:47:06 +07:00

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
}