mirror of
https://github.com/MontFerret/ferret.git
synced 2025-07-13 01:20:35 +02:00
Feature/pre compiled eval scripts (#658)
* Added support of pre-compiled eval expressions * Added unit tests for eval.Function * Added RemoteType and RemoteObjectType enums * Refactored function generation * Refactored Document and Element loading logic * Removed redundant fields from cdp.Page * Exposed eval.Runtime to external callers * Added new eval.RemoteValue interface
This commit is contained in:
@ -2,7 +2,6 @@ package dom
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/mafredri/cdp/protocol/runtime"
|
||||
"hash/fnv"
|
||||
|
||||
"github.com/mafredri/cdp"
|
||||
@ -31,69 +30,6 @@ type HTMLDocument struct {
|
||||
element *HTMLElement
|
||||
}
|
||||
|
||||
func LoadRootHTMLDocument(
|
||||
ctx context.Context,
|
||||
logger zerolog.Logger,
|
||||
client *cdp.Client,
|
||||
domManager *Manager,
|
||||
mouse *input.Mouse,
|
||||
keyboard *input.Keyboard,
|
||||
) (*HTMLDocument, error) {
|
||||
ftRepl, err := client.Page.GetFrameTree(ctx)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return LoadHTMLDocument(
|
||||
ctx,
|
||||
logger,
|
||||
client,
|
||||
domManager,
|
||||
mouse,
|
||||
keyboard,
|
||||
ftRepl.FrameTree,
|
||||
)
|
||||
}
|
||||
|
||||
func LoadHTMLDocument(
|
||||
ctx context.Context,
|
||||
logger zerolog.Logger,
|
||||
client *cdp.Client,
|
||||
domManager *Manager,
|
||||
mouse *input.Mouse,
|
||||
keyboard *input.Keyboard,
|
||||
frameTree page.FrameTree,
|
||||
) (*HTMLDocument, error) {
|
||||
exec, err := eval.Create(ctx, logger, client, frameTree.Frame.ID)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
inputManager := input.NewManager(logger, client, exec, keyboard, mouse)
|
||||
|
||||
exec.SetLoader(func(ctx context.Context, remoteType eval.RemoteType, id runtime.RemoteObjectID) (core.Value, error) {
|
||||
return NewHTMLElement(logger, client, domManager, inputManager, exec, id), nil
|
||||
})
|
||||
|
||||
rootElement, err := exec.EvalElement(ctx, templates.GetDocument())
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to load root element")
|
||||
}
|
||||
|
||||
return NewHTMLDocument(
|
||||
logger,
|
||||
client,
|
||||
domManager,
|
||||
inputManager,
|
||||
exec,
|
||||
rootElement.(*HTMLElement),
|
||||
frameTree,
|
||||
), nil
|
||||
}
|
||||
|
||||
func NewHTMLDocument(
|
||||
logger zerolog.Logger,
|
||||
client *cdp.Client,
|
||||
@ -396,8 +332,8 @@ func (doc *HTMLDocument) Scroll(ctx context.Context, options drivers.ScrollOptio
|
||||
return doc.input.ScrollByXY(ctx, options)
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) Eval(ctx context.Context, expression string) (core.Value, error) {
|
||||
return doc.eval.EvalValue(ctx, eval.F(expression))
|
||||
func (doc *HTMLDocument) Eval() *eval.Runtime {
|
||||
return doc.eval
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) logError(err error) *zerolog.Event {
|
||||
|
Reference in New Issue
Block a user