1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-01-04 03:02:02 +02:00

Added support of Element.nextElementSibling and Element.previousEleme… (#569)

* Added support of Element.nextElementSibling and Element.previousElementSibling

* Fixed linting issues

* Removed reedundant logger use
This commit is contained in:
Tim Voronov 2020-11-13 21:48:00 -05:00 committed by GitHub
parent 8a40d7b46f
commit 01088247e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 175 additions and 7 deletions

View File

@ -4,8 +4,8 @@ const ITEMS = [{"artist":"Lil Tecca","track":"Ransom"},{"artist":"NLE Choppa","t
export default class ListsPage extends React.Component {
render() {
const items = ITEMS.map((i) => {
return e("li", { className: "list-group-item track"}, [
const items = ITEMS.map((i, idx) => {
return e("li", { className: "list-group-item track", 'data-index': idx }, [
e("div", { className: "track-details"}, [
e("h5", { className: "track-artist"}, i.artist),
e("small", { className: "track-name"}, i.track)

View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Ferret E2E SPA</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="./assets/bootstrap.min.css" crossorigin="anonymous">
</head>
<body class="text-center">
<div id="root"><div id="layout"><nav class="navbar navbar-expand-md navbar-dark bg-dark mb-4" id="navbar"><a class="navbar-brand active" aria-current="page" href="http://localhost:8080/#/">Ferret</a><button class="navbar-toggler" type="button"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse"><ul class="navbar-nav mr-auto"><li class="nav-item"><a class="nav-link" href="http://localhost:8080/#/forms">Forms</a></li><li class="nav-item"><a class="nav-link" href="http://localhost:8080/#/navigation">Navigation</a></li><li class="nav-item"><a class="nav-link" href="http://localhost:8080/#/events">Events</a></li><li class="nav-item"><a class="nav-link" href="http://localhost:8080/#/iframe">iFrame</a></li></ul></div></nav><main class="container"><div id="tracks"><ul class="list-group track-list"><li class="list-group-item track" data-index="0"><div class="track-details"><h5 class="track-artist">Lil Tecca</h5><small class="track-name">Ransom</small></div></li><li class="list-group-item track" data-index="1"><div class="track-details"><h5 class="track-artist">NLE Choppa</h5><small class="track-name">Shotta Flow (Feat. Blueface) [Remix]</small></div></li><li class="list-group-item track" data-index="2"><div class="track-details"><h5 class="track-artist">Baby Jesus (DaBaby)</h5><small class="track-name">Suge</small></div></li><li class="list-group-item track" data-index="3"><div class="track-details"><h5 class="track-artist">NLE Choppa</h5><small class="track-name">Shotta Flow 3</small></div></li><li class="list-group-item track" data-index="4"><div class="track-details"><h5 class="track-artist">Lil Tecca </h5><small class="track-name">Lil Tecca - Did It Again</small></div></li><li class="list-group-item track" data-index="5"><div class="track-details"><h5 class="track-artist">NLE Choppa</h5><small class="track-name">Shotta Flow</small></div></li><li class="list-group-item track" data-index="6"><div class="track-details"><h5 class="track-artist">Ynw Melly</h5><small class="track-name">Dangerously In Love (772 Love Pt. 2)</small></div></li><li class="list-group-item track" data-index="7"><div class="track-details"><h5 class="track-artist">POLO G</h5><small class="track-name">Polo G feat. Lil TJay - Pop Out</small></div></li><li class="list-group-item track" data-index="8"><div class="track-details"><h5 class="track-artist">MUSTARD</h5><small class="track-name">Ballin' (feat. Roddy Ricch)</small></div></li><li class="list-group-item track" data-index="9"><div class="track-details"><h5 class="track-artist">Lil Nas X</h5><small class="track-name">Panini</small></div></li><li class="list-group-item track" data-index="10"><div class="track-details"><h5 class="track-artist">Juice WRLD</h5><small class="track-name">Juice Wrld - RUN</small></div></li><li class="list-group-item track" data-index="11"><div class="track-details"><h5 class="track-artist">Shordie Shordie</h5><small class="track-name">Betchua (Bitchuary)</small></div></li><li class="list-group-item track" data-index="12"><div class="track-details"><h5 class="track-artist">Post Malone</h5><small class="track-name">Goodbyes (feat. Young Thug)</small></div></li><li class="list-group-item track" data-index="13"><div class="track-details"><h5 class="track-artist">LIL UZI VERT</h5><small class="track-name">Sanguine Paradise</small></div></li><li class="list-group-item track" data-index="14"><div class="track-details"><h5 class="track-artist">Calboy</h5><small class="track-name">Envy Me</small></div></li><li class="list-group-item track" data-index="15"><div class="track-details"><h5 class="track-artist">Ambjaay</h5><small class="track-name">Uno</small></div></li><li class="list-group-item track" data-index="16"><div class="track-details"><h5 class="track-artist">Lil Tecca</h5><small class="track-name">Lil Tecca - Bossanova</small></div></li><li class="list-group-item track" data-index="17"><div class="track-details"><h5 class="track-artist">Lil Baby</h5><small class="track-name">Baby</small></div></li><li class="list-group-item track" data-index="18"><div class="track-details"><h5 class="track-artist">Lil Tjay</h5><small class="track-name">Lil Tjay - Brothers (Prod by JDONTHATRACK &amp; Protegebeatz)</small></div></li><li class="list-group-item track" data-index="19"><div class="track-details"><h5 class="track-artist">YK Osiris</h5><small class="track-name">Worth It</small></div></li></ul></div></main></div></div>
</body></html>

View File

@ -0,0 +1,12 @@
LET doc = DOCUMENT(@lab.cdn.dynamic + "/#/lists", { driver:"cdp" })
LET current = ELEMENT(doc, ".track")
T::NOT::NONE(current)
LET next = current.nextElementSibling
T::NOT::NONE(next)
LET currentIdx = TO_INT(current.attributes['data-index'])
LET nextIdx = TO_INT(next.attributes['data-index'])
T::GT(nextIdx, currentIdx)
RETURN NONE

View File

@ -0,0 +1,12 @@
LET doc = DOCUMENT(@lab.cdn.dynamic + "/#/lists", { driver:"cdp" })
LET current = ELEMENT(doc, '[data-index="1"]')
T::NOT::NONE(current)
LET prev = current.previousElementSibling
T::NOT::NONE(prev)
LET currentIdx = TO_INT(current.attributes['data-index'])
LET prevIdx = TO_INT(prev.attributes['data-index'])
T::LT(prevIdx, currentIdx)
RETURN NONE

View File

@ -0,0 +1,13 @@
LET url = @lab.cdn.static + '/list.html'
LET doc = DOCUMENT(url)
LET current = ELEMENT(doc, ".track")
T::NOT::NONE(current)
LET next = current.nextElementSibling.nextElementSibling
T::NOT::NONE(next)
LET currentIdx = TO_INT(current.attributes['data-index'])
LET nextIdx = TO_INT(next.attributes['data-index'])
T::GT(nextIdx, currentIdx)
RETURN NONE

View File

@ -0,0 +1,13 @@
LET url = @lab.cdn.static + '/list.html'
LET doc = DOCUMENT(url)
LET current = ELEMENT(doc, '[data-index="1"]')
T::NOT::NONE(current)
LET prev = current.previousElementSibling
T::NOT::NONE(prev)
LET currentIdx = TO_INT(current.attributes['data-index'])
LET prevIdx = TO_INT(prev.attributes['data-index'])
T::LT(prevIdx, currentIdx)
RETURN NONE

View File

@ -215,6 +215,26 @@ func TestMember(t *testing.T) {
So(string(out), ShouldEqual, `"Bob"`)
})
Convey("Computed property with quotes", func() {
c := compiler.New()
p := c.MustCompile(`
LET obj = {
attributes: {
'data-index': 1
}
}
RETURN obj.attributes['data-index']
`)
out, err := p.Run(context.Background())
So(err, ShouldBeNil)
So(string(out), ShouldEqual, "1")
})
})
}

View File

@ -527,6 +527,51 @@ func (el *HTMLElement) GetChildNode(ctx context.Context, idx values.Int) (core.V
)
}
func (el *HTMLElement) GetPreviousElementSibling(ctx context.Context) (core.Value, error) {
return el.getSibling(ctx, templates.GetPreviousElementSibling())
}
func (el *HTMLElement) GetNextElementSibling(ctx context.Context) (core.Value, error) {
return el.getSibling(ctx, templates.GetNextElementSibling())
}
func (el *HTMLElement) getSibling(ctx context.Context, expr string) (core.Value, error) {
if el.IsDetached() {
return values.None, drivers.ErrDetached
}
obj, err := el.exec.EvalWithArgumentsAndReturnReference(ctx, expr, runtime.CallArgument{
ObjectID: &el.id.ObjectID,
})
if err != nil {
return values.None, err
}
if obj.Type != "object" || obj.ObjectID == nil {
return values.None, nil
}
repl, err := el.client.DOM.RequestNode(ctx, dom.NewRequestNodeArgs(*obj.ObjectID))
if err != nil {
return values.None, err
}
return LoadHTMLElementWithID(
ctx,
el.logger,
el.client,
el.dom,
el.input,
el.exec,
HTMLElementIdentity{
NodeID: repl.NodeID,
ObjectID: *obj.ObjectID,
},
)
}
func (el *HTMLElement) QuerySelector(ctx context.Context, selector values.String) (core.Value, error) {
if el.IsDetached() {
return values.None, drivers.ErrDetached

View File

@ -0,0 +1,12 @@
package templates
const getPreviousElementSibling = "(el) => el.previousElementSibling"
const getNextElementSibling = "(el) => el.nextElementSibling"
func GetPreviousElementSibling() string {
return getPreviousElementSibling
}
func GetNextElementSibling() string {
return getNextElementSibling
}

View File

@ -194,6 +194,10 @@ func GetInElement(ctx context.Context, el drivers.HTMLElement, path []core.Value
}
return values.GetIn(ctx, styles, path[1:])
case "previousElementSibling":
return el.GetPreviousElementSibling(ctx)
case "nextElementSibling":
return el.GetNextElementSibling(ctx)
default:
return GetInNode(ctx, el, path)
}

View File

@ -489,6 +489,26 @@ func (el *HTMLElement) Iterate(_ context.Context) (core.Iterator, error) {
return common.NewIterator(el)
}
func (el *HTMLElement) GetPreviousElementSibling(_ context.Context) (core.Value, error) {
sibling := el.selection.Prev()
if sibling == nil {
return values.None, nil
}
return NewHTMLElement(sibling)
}
func (el *HTMLElement) GetNextElementSibling(_ context.Context) (core.Value, error) {
sibling := el.selection.Next()
if sibling == nil {
return values.None, nil
}
return NewHTMLElement(sibling)
}
func (el *HTMLElement) Click(_ context.Context, _ values.Int) error {
return core.ErrNotSupported
}
@ -608,12 +628,14 @@ func (el *HTMLElement) ensureAttrs() {
func (el *HTMLElement) parseAttrs() *values.Object {
obj := values.NewObject()
for _, name := range common.Attributes {
val, ok := el.selection.Attr(name)
if len(el.selection.Nodes) == 0 {
return obj
}
if ok {
obj.Set(values.NewString(name), values.NewString(val))
}
node := el.selection.Nodes[0]
for _, attr := range node.Attr {
obj.Set(values.NewString(attr.Key), values.NewString(attr.Val))
}
return obj

View File

@ -93,6 +93,10 @@ type (
GetInnerTextBySelectorAll(ctx context.Context, selector values.String) (*values.Array, error)
GetPreviousElementSibling(ctx context.Context) (core.Value, error)
GetNextElementSibling(ctx context.Context) (core.Value, error)
Click(ctx context.Context, count values.Int) error
ClickBySelector(ctx context.Context, selector values.String, count values.Int) error