mirror of
https://github.com/MontFerret/ferret.git
synced 2025-07-15 01:25:00 +02:00
Fixed synchonization
This commit is contained in:
@ -1,32 +0,0 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type SyncValue struct {
|
||||
sync.Mutex
|
||||
value core.Value
|
||||
}
|
||||
|
||||
func NewSyncValue(init core.Value) *SyncValue {
|
||||
val := new(SyncValue)
|
||||
val.value = init
|
||||
|
||||
return val
|
||||
}
|
||||
|
||||
func (sv *SyncValue) Get() core.Value {
|
||||
sv.Lock()
|
||||
defer sv.Unlock()
|
||||
|
||||
return sv.value
|
||||
}
|
||||
|
||||
func (sv *SyncValue) Set(val core.Value) {
|
||||
sv.Lock()
|
||||
defer sv.Unlock()
|
||||
|
||||
sv.value = val
|
||||
}
|
@ -23,13 +23,13 @@ type HtmlElement struct {
|
||||
sync.Mutex
|
||||
client *cdp.Client
|
||||
broker *events.EventBroker
|
||||
connected *common.SyncValue
|
||||
connected values.Boolean
|
||||
id dom.NodeID
|
||||
nodeType values.Int
|
||||
nodeName values.String
|
||||
innerHtml *common.SyncValue
|
||||
innerHtml values.String
|
||||
innerText *common.LazyValue
|
||||
value string
|
||||
value values.String
|
||||
attributes *common.LazyValue
|
||||
children []dom.NodeID
|
||||
loadedChildren *common.LazyValue
|
||||
@ -85,11 +85,11 @@ func NewHtmlElement(
|
||||
el := new(HtmlElement)
|
||||
el.client = client
|
||||
el.broker = broker
|
||||
el.connected = common.NewSyncValue(values.True)
|
||||
el.connected = values.True
|
||||
el.id = id
|
||||
el.nodeType = values.NewInt(node.NodeType)
|
||||
el.nodeName = values.NewString(node.NodeName)
|
||||
el.innerHtml = common.NewSyncValue(innerHtml)
|
||||
el.innerHtml = innerHtml
|
||||
el.innerText = common.NewLazyValue(func() (core.Value, error) {
|
||||
h := el.InnerHtml()
|
||||
|
||||
@ -110,7 +110,7 @@ func NewHtmlElement(
|
||||
el.attributes = common.NewLazyValue(func() (core.Value, error) {
|
||||
return parseAttrs(node.Attributes), nil
|
||||
})
|
||||
el.value = ""
|
||||
el.value = values.EmptyString
|
||||
el.loadedChildren = common.NewLazyValue(func() (core.Value, error) {
|
||||
if !el.IsConnected() {
|
||||
return values.NewArray(0), nil
|
||||
@ -120,13 +120,16 @@ func NewHtmlElement(
|
||||
})
|
||||
|
||||
if node.Value != nil {
|
||||
el.value = *node.Value
|
||||
el.value = values.NewString(*node.Value)
|
||||
}
|
||||
|
||||
el.children = createChildrenArray(node.Children)
|
||||
|
||||
broker.AddEventListener("reload", func(_ interface{}) {
|
||||
el.connected.Set(values.False)
|
||||
el.Lock()
|
||||
defer el.Unlock()
|
||||
|
||||
el.connected = false
|
||||
})
|
||||
|
||||
broker.AddEventListener("attr:modified", func(message interface{}) {
|
||||
@ -286,7 +289,7 @@ func NewHtmlElement(
|
||||
return
|
||||
}
|
||||
|
||||
el.innerHtml.Set(newInnerHtml)
|
||||
el.innerHtml = newInnerHtml
|
||||
})
|
||||
|
||||
broker.AddEventListener("children:deleted", func(message interface{}) {
|
||||
@ -339,7 +342,7 @@ func NewHtmlElement(
|
||||
return
|
||||
}
|
||||
|
||||
el.innerHtml.Set(newInnerHtml)
|
||||
el.innerHtml = newInnerHtml
|
||||
})
|
||||
|
||||
return el
|
||||
@ -354,24 +357,14 @@ func (el *HtmlElement) Type() core.Type {
|
||||
}
|
||||
|
||||
func (el *HtmlElement) MarshalJSON() ([]byte, error) {
|
||||
ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout)
|
||||
el.Lock()
|
||||
defer el.Unlock()
|
||||
|
||||
defer cancelFn()
|
||||
|
||||
args := dom.NewGetOuterHTMLArgs()
|
||||
args.NodeID = &el.id
|
||||
|
||||
reply, err := el.client.DOM.GetOuterHTML(ctx, args)
|
||||
|
||||
if err != nil {
|
||||
return nil, core.Error(err, strconv.Itoa(int(el.id)))
|
||||
}
|
||||
|
||||
return json.Marshal(reply.OuterHTML)
|
||||
return json.Marshal(el.innerHtml)
|
||||
}
|
||||
|
||||
func (el *HtmlElement) String() string {
|
||||
return el.value
|
||||
return el.value.String()
|
||||
}
|
||||
|
||||
func (el *HtmlElement) Compare(other core.Value) int {
|
||||
@ -479,6 +472,10 @@ func (el *HtmlElement) GetChildNode(idx values.Int) core.Value {
|
||||
}
|
||||
|
||||
func (el *HtmlElement) QuerySelector(selector values.String) core.Value {
|
||||
if !el.IsConnected() {
|
||||
return values.NewArray(0)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
selectorArgs := dom.NewQuerySelectorArgs(el.id, selector.String())
|
||||
@ -498,6 +495,10 @@ func (el *HtmlElement) QuerySelector(selector values.String) core.Value {
|
||||
}
|
||||
|
||||
func (el *HtmlElement) QuerySelectorAll(selector values.String) core.Value {
|
||||
if !el.IsConnected() {
|
||||
return values.NewArray(0)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
selectorArgs := dom.NewQuerySelectorAllArgs(el.id, selector.String())
|
||||
@ -533,7 +534,10 @@ func (el *HtmlElement) InnerText() values.String {
|
||||
}
|
||||
|
||||
func (el *HtmlElement) InnerHtml() values.String {
|
||||
return el.innerHtml.Get().(values.String)
|
||||
el.Lock()
|
||||
defer el.Unlock()
|
||||
|
||||
return el.innerHtml
|
||||
}
|
||||
|
||||
func (el *HtmlElement) Click() (values.Boolean, error) {
|
||||
@ -545,5 +549,8 @@ func (el *HtmlElement) Click() (values.Boolean, error) {
|
||||
}
|
||||
|
||||
func (el *HtmlElement) IsConnected() values.Boolean {
|
||||
return el.connected.Get().(values.Boolean)
|
||||
el.Lock()
|
||||
defer el.Unlock()
|
||||
|
||||
return el.connected
|
||||
}
|
||||
|
Reference in New Issue
Block a user