From 38478e45ebbbc33f94cf23c657d7adb63a43887f Mon Sep 17 00:00:00 2001 From: Tim Voronov Date: Thu, 27 Sep 2018 00:45:07 -0400 Subject: [PATCH] Fixed synchonization --- .../driver/common/{lazy-value.go => lazy.go} | 0 pkg/stdlib/html/driver/common/sync-value.go | 32 ---------- pkg/stdlib/html/driver/dynamic/element.go | 59 +++++++++++-------- 3 files changed, 33 insertions(+), 58 deletions(-) rename pkg/stdlib/html/driver/common/{lazy-value.go => lazy.go} (100%) delete mode 100644 pkg/stdlib/html/driver/common/sync-value.go diff --git a/pkg/stdlib/html/driver/common/lazy-value.go b/pkg/stdlib/html/driver/common/lazy.go similarity index 100% rename from pkg/stdlib/html/driver/common/lazy-value.go rename to pkg/stdlib/html/driver/common/lazy.go diff --git a/pkg/stdlib/html/driver/common/sync-value.go b/pkg/stdlib/html/driver/common/sync-value.go deleted file mode 100644 index 4ce99c91..00000000 --- a/pkg/stdlib/html/driver/common/sync-value.go +++ /dev/null @@ -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 -} diff --git a/pkg/stdlib/html/driver/dynamic/element.go b/pkg/stdlib/html/driver/dynamic/element.go index ee7ff80c..6835cd1f 100644 --- a/pkg/stdlib/html/driver/dynamic/element.go +++ b/pkg/stdlib/html/driver/dynamic/element.go @@ -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 }