package cdp import ( "context" "github.com/MontFerret/ferret/pkg/drivers" "github.com/MontFerret/ferret/pkg/drivers/common" "github.com/mafredri/cdp" "github.com/mafredri/cdp/protocol/emulation" "github.com/mafredri/cdp/protocol/network" "github.com/mafredri/cdp/protocol/page" "golang.org/x/sync/errgroup" ) type ( batchFunc = func() error ) func runBatch(funcs ...batchFunc) error { eg := errgroup.Group{} for _, f := range funcs { eg.Go(f) } return eg.Wait() } func enableFeatures(ctx context.Context, client *cdp.Client, params drivers.Params) error { if err := client.Page.Enable(ctx); err != nil { return err } return runBatch( func() error { return client.Page.SetLifecycleEventsEnabled( ctx, page.NewSetLifecycleEventsEnabledArgs(true), ) }, func() error { return client.DOM.Enable(ctx) }, func() error { return client.Runtime.Enable(ctx) }, func() error { ua := common.GetUserAgent(params.UserAgent) //logger. // Debug(). // Timestamp(). // Str("user-agent", ua). // Msg("using User-Agent") // do not use custom user agent if ua == "" { return nil } return client.Emulation.SetUserAgentOverride( ctx, emulation.NewSetUserAgentOverrideArgs(ua), ) }, func() error { return client.Network.Enable(ctx, network.NewEnableArgs()) }, func() error { return client.Page.SetBypassCSP(ctx, page.NewSetBypassCSPArgs(true)) }, func() error { if params.Viewport == nil { return nil } orientation := emulation.ScreenOrientation{} if !params.Viewport.Landscape { orientation.Type = "portraitPrimary" orientation.Angle = 0 } else { orientation.Type = "landscapePrimary" orientation.Angle = 90 } scaleFactor := params.Viewport.ScaleFactor if scaleFactor <= 0 { scaleFactor = 1 } deviceArgs := emulation.NewSetDeviceMetricsOverrideArgs( params.Viewport.Width, params.Viewport.Height, scaleFactor, params.Viewport.Mobile, ).SetScreenOrientation(orientation) return client.Emulation.SetDeviceMetricsOverride( ctx, deviceArgs, ) }, ) }