89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package playwright
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
type selectorsOwnerImpl struct {
|
|
channelOwner
|
|
}
|
|
|
|
func (s *selectorsOwnerImpl) setTestIdAttributeName(name string) {
|
|
s.channel.SendNoReply("setTestIdAttributeName", map[string]interface{}{
|
|
"testIdAttributeName": name,
|
|
})
|
|
}
|
|
|
|
func newSelectorsOwner(parent *channelOwner, objectType string, guid string, initializer map[string]interface{}) *selectorsOwnerImpl {
|
|
obj := &selectorsOwnerImpl{}
|
|
obj.createChannelOwner(obj, parent, objectType, guid, initializer)
|
|
return obj
|
|
}
|
|
|
|
type selectorsImpl struct {
|
|
channels sync.Map
|
|
registrations []map[string]interface{}
|
|
}
|
|
|
|
func (s *selectorsImpl) Register(name string, script Script, options ...SelectorsRegisterOptions) error {
|
|
if script.Path == nil && script.Content == nil {
|
|
return errors.New("Either source or path should be specified")
|
|
}
|
|
source := ""
|
|
if script.Path != nil {
|
|
content, err := os.ReadFile(*script.Path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
source = string(content)
|
|
} else {
|
|
source = *script.Content
|
|
}
|
|
params := map[string]interface{}{
|
|
"name": name,
|
|
"source": source,
|
|
}
|
|
if len(options) == 1 && options[0].ContentScript != nil {
|
|
params["contentScript"] = *options[0].ContentScript
|
|
}
|
|
var err error
|
|
s.channels.Range(func(key, value any) bool {
|
|
_, err = value.(*selectorsOwnerImpl).channel.Send("register", params)
|
|
return err == nil
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
s.registrations = append(s.registrations, params)
|
|
return nil
|
|
}
|
|
|
|
func (s *selectorsImpl) SetTestIdAttribute(name string) {
|
|
setTestIdAttributeName(name)
|
|
s.channels.Range(func(key, value any) bool {
|
|
value.(*selectorsOwnerImpl).setTestIdAttributeName(name)
|
|
return true
|
|
})
|
|
}
|
|
|
|
func (s *selectorsImpl) addChannel(channel *selectorsOwnerImpl) {
|
|
s.channels.Store(channel.guid, channel)
|
|
for _, params := range s.registrations {
|
|
channel.channel.SendNoReply("register", params)
|
|
channel.setTestIdAttributeName(getTestIdAttributeName())
|
|
}
|
|
}
|
|
|
|
func (s *selectorsImpl) removeChannel(channel *selectorsOwnerImpl) {
|
|
s.channels.Delete(channel.guid)
|
|
}
|
|
|
|
func newSelectorsImpl() *selectorsImpl {
|
|
return &selectorsImpl{
|
|
channels: sync.Map{},
|
|
registrations: make([]map[string]interface{}, 0),
|
|
}
|
|
}
|