166 lines
4.5 KiB
Go
166 lines
4.5 KiB
Go
package playwright
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
type localUtilsImpl struct {
|
|
channelOwner
|
|
Devices map[string]*DeviceDescriptor
|
|
}
|
|
|
|
type (
|
|
localUtilsZipOptions struct {
|
|
ZipFile string `json:"zipFile"`
|
|
Entries []interface{} `json:"entries"`
|
|
StacksId string `json:"stacksId"`
|
|
Mode string `json:"mode"`
|
|
IncludeSources bool `json:"includeSources"`
|
|
}
|
|
|
|
harLookupOptions struct {
|
|
HarId string `json:"harId"`
|
|
URL string `json:"url"`
|
|
Method string `json:"method"`
|
|
Headers map[string]string `json:"headers"`
|
|
IsNavigationRequest bool `json:"isNavigationRequest"`
|
|
PostData interface{} `json:"postData,omitempty"`
|
|
}
|
|
|
|
harLookupResult struct {
|
|
Action string `json:"action"`
|
|
Message *string `json:"message,omitempty"`
|
|
RedirectURL *string `json:"redirectUrl,omitempty"`
|
|
Status *int `json:"status,omitempty"`
|
|
Headers []map[string]string `json:"headers,omitempty"`
|
|
Body *string `json:"body,omitempty"`
|
|
}
|
|
)
|
|
|
|
func (l *localUtilsImpl) Zip(options localUtilsZipOptions) (interface{}, error) {
|
|
return l.channel.Send("zip", options)
|
|
}
|
|
|
|
func (l *localUtilsImpl) HarOpen(file string) (string, error) {
|
|
result, err := l.channel.SendReturnAsDict("harOpen", []map[string]interface{}{
|
|
{
|
|
"file": file,
|
|
},
|
|
})
|
|
if err == nil {
|
|
if harId, ok := result["harId"]; ok {
|
|
return harId.(string), nil
|
|
}
|
|
if err, ok := result["error"]; ok {
|
|
return "", fmt.Errorf("%w:%v", ErrPlaywright, err)
|
|
}
|
|
}
|
|
return "", err
|
|
}
|
|
|
|
func (l *localUtilsImpl) HarLookup(option harLookupOptions) (*harLookupResult, error) {
|
|
overrides := make(map[string]interface{})
|
|
overrides["harId"] = option.HarId
|
|
overrides["url"] = option.URL
|
|
overrides["method"] = option.Method
|
|
if option.Headers != nil {
|
|
overrides["headers"] = serializeMapToNameAndValue(option.Headers)
|
|
}
|
|
overrides["isNavigationRequest"] = option.IsNavigationRequest
|
|
if option.PostData != nil {
|
|
switch v := option.PostData.(type) {
|
|
case string:
|
|
overrides["postData"] = base64.StdEncoding.EncodeToString([]byte(v))
|
|
case []byte:
|
|
overrides["postData"] = base64.StdEncoding.EncodeToString(v)
|
|
}
|
|
}
|
|
ret, err := l.channel.SendReturnAsDict("harLookup", overrides)
|
|
if ret == nil {
|
|
return nil, err
|
|
}
|
|
var result harLookupResult
|
|
mJson, err := json.Marshal(ret)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = json.Unmarshal(mJson, &result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if result.Body != nil {
|
|
body, err := base64.StdEncoding.DecodeString(*result.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result.Body = String(string(body))
|
|
}
|
|
return &result, err
|
|
}
|
|
|
|
func (l *localUtilsImpl) HarClose(harId string) error {
|
|
_, err := l.channel.Send("harClose", []map[string]interface{}{
|
|
{
|
|
"harId": harId,
|
|
},
|
|
})
|
|
return err
|
|
}
|
|
|
|
func (l *localUtilsImpl) HarUnzip(zipFile, harFile string) error {
|
|
_, err := l.channel.Send("harUnzip", []map[string]interface{}{
|
|
{
|
|
"zipFile": zipFile,
|
|
"harFile": harFile,
|
|
},
|
|
})
|
|
return err
|
|
}
|
|
|
|
func (l *localUtilsImpl) TracingStarted(traceName string, tracesDir ...string) (string, error) {
|
|
overrides := make(map[string]interface{})
|
|
overrides["traceName"] = traceName
|
|
if len(tracesDir) > 0 {
|
|
overrides["tracesDir"] = tracesDir[0]
|
|
}
|
|
stacksId, err := l.channel.Send("tracingStarted", overrides)
|
|
if stacksId == nil {
|
|
return "", err
|
|
}
|
|
return stacksId.(string), err
|
|
}
|
|
|
|
func (l *localUtilsImpl) TraceDiscarded(stacksId string) error {
|
|
_, err := l.channel.Send("traceDiscarded", map[string]interface{}{
|
|
"stacksId": stacksId,
|
|
})
|
|
return err
|
|
}
|
|
|
|
func (l *localUtilsImpl) AddStackToTracingNoReply(id uint32, stack []map[string]interface{}) {
|
|
l.channel.SendNoReply("addStackToTracingNoReply", map[string]interface{}{
|
|
"callData": map[string]interface{}{
|
|
"id": id,
|
|
"stack": stack,
|
|
},
|
|
})
|
|
}
|
|
|
|
func newLocalUtils(parent *channelOwner, objectType string, guid string, initializer map[string]interface{}) *localUtilsImpl {
|
|
l := &localUtilsImpl{
|
|
Devices: make(map[string]*DeviceDescriptor),
|
|
}
|
|
l.createChannelOwner(l, parent, objectType, guid, initializer)
|
|
for _, dd := range initializer["deviceDescriptors"].([]interface{}) {
|
|
entry := dd.(map[string]interface{})
|
|
l.Devices[entry["name"].(string)] = &DeviceDescriptor{
|
|
Viewport: &Size{},
|
|
}
|
|
remapMapToStruct(entry["descriptor"], l.Devices[entry["name"].(string)])
|
|
}
|
|
l.markAsInternalType()
|
|
return l
|
|
}
|