1
0
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:
Tim Voronov
2021-09-19 19:35:54 -04:00
committed by GitHub
parent 90427cd537
commit 847dda1f10
23 changed files with 1264 additions and 417 deletions

View File

@ -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 {