Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor parseConsoleRemoteObject to return error #1166

Merged
merged 2 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion common/frame_session.go
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,10 @@ func (fs *FrameSession) onConsoleAPICalled(event *cdpruntime.EventConsoleAPICall

parsedObjects := make([]string, 0, len(event.Args))
for _, robj := range event.Args {
s := parseConsoleRemoteObject(fs.logger, robj)
s, err := parseConsoleRemoteObject(fs.logger, robj)
if err != nil {
fs.logger.Errorf("onConsoleAPICalled", "failed to parse console message %v", err)
}
parsedObjects = append(parsedObjects, s)
}

Expand Down
5 changes: 4 additions & 1 deletion common/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -1398,7 +1398,10 @@ func (p *Page) consoleMsgFromConsoleEvent(e *cdpruntime.EventConsoleAPICalled) (
)

for _, robj := range e.Args {
s := parseConsoleRemoteObject(p.logger, robj)
s, err := parseConsoleRemoteObject(p.logger, robj)
if err != nil {
p.logger.Errorf("consoleMsgFromConsoleEvent", "failed to parse console message %v", err)
}

objects = append(objects, s)
objectHandles = append(objectHandles, NewJSHandle(
Expand Down
42 changes: 24 additions & 18 deletions common/remote_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,42 +227,48 @@ func valueFromRemoteObject(_ context.Context, robj *cdpruntime.RemoteObject) (an
return val, err
}

func parseConsoleRemoteObjectPreview(logger *log.Logger, op *cdpruntime.ObjectPreview) string {
func parseConsoleRemoteObjectPreview(logger *log.Logger, op *cdpruntime.ObjectPreview) (string, error) {
obj := make(map[string]string)
if op.Overflow {
logger.Infof("parseConsoleRemoteObjectPreview", "object is too large and will be parsed partially")
}

for _, p := range op.Properties {
val := parseConsoleRemoteObjectValue(logger, p.Type, p.Subtype, p.Value, p.ValuePreview)
val, err := parseConsoleRemoteObjectValue(logger, p.Type, p.Subtype, p.Value, p.ValuePreview)
if err != nil {
return "", err
}
obj[p.Name] = val
}

bb, err := json.Marshal(obj)
if err != nil {
logger.Errorf("parseConsoleRemoteObjectPreview", "failed to marshal object to string: %v", err)
return "", fmt.Errorf("marshaling object %q to string: %w", obj, err)
}

return string(bb)
return string(bb), nil
}

func parseConsoleRemoteArrayPreview(logger *log.Logger, op *cdpruntime.ObjectPreview) string {
func parseConsoleRemoteArrayPreview(logger *log.Logger, op *cdpruntime.ObjectPreview) (string, error) {
arr := make([]any, 0, len(op.Properties))
if op.Overflow {
logger.Warnf("parseConsoleRemoteArrayPreview", "array is too large and will be parsed partially")
logger.Infof("parseConsoleRemoteArrayPreview", "array is too large and will be parsed partially")
}

for _, p := range op.Properties {
val := parseConsoleRemoteObjectValue(logger, p.Type, p.Subtype, p.Value, p.ValuePreview)
val, err := parseConsoleRemoteObjectValue(logger, p.Type, p.Subtype, p.Value, p.ValuePreview)
if err != nil {
return "", err
inancgumus marked this conversation as resolved.
Show resolved Hide resolved
}
arr = append(arr, val)
}

bb, err := json.Marshal(arr)
if err != nil {
logger.Errorf("parseConsoleRemoteArrayPreview", "failed to marshal array to string: %v", err)
return "", fmt.Errorf("marshaling array %q to string: %w", arr, err)
}

return string(bb)
return string(bb), nil
}

//nolint:cyclop
Expand All @@ -272,12 +278,12 @@ func parseConsoleRemoteObjectValue(
st cdpruntime.Subtype,
val string,
op *cdpruntime.ObjectPreview,
) string {
) (string, error) {
switch t {
case cdpruntime.TypeAccessor:
return "accessor"
return "accessor", nil
case cdpruntime.TypeFunction:
return "function()"
return "function()", nil
case cdpruntime.TypeString:
if strings.HasPrefix(val, `"`) {
val = strings.TrimPrefix(val, `"`)
Expand All @@ -291,13 +297,13 @@ func parseConsoleRemoteObjectValue(
return parseConsoleRemoteObjectPreview(logger, op)
}
if val == "Object" {
return val
return val, nil
}
if st == "null" {
return "null"
return "null", nil
}
case cdpruntime.TypeUndefined:
return "undefined"
return "undefined", nil
// The following cases are here to clarify that all cases have been
// considered, but that the result will return val without processing it.
case cdpruntime.TypeNumber:
Expand All @@ -306,15 +312,15 @@ func parseConsoleRemoteObjectValue(
case cdpruntime.TypeBigint:
}

return val
return val, nil
}

// parseConsoleRemoteObject is to be used by callers that are working with
// console messages that are written to Chrome's console by the website under
// test.
func parseConsoleRemoteObject(logger *log.Logger, obj *cdpruntime.RemoteObject) string {
func parseConsoleRemoteObject(logger *log.Logger, obj *cdpruntime.RemoteObject) (string, error) {
if obj.UnserializableValue != "" {
return obj.UnserializableValue.String()
return obj.UnserializableValue.String(), nil
}

return parseConsoleRemoteObjectValue(logger, obj.Type, obj.Subtype, string(obj.Value), obj.Preview)
Expand Down
Loading