diff --git a/cdp/types.go b/cdp/types.go index 8b9014a..59d9bde 100644 --- a/cdp/types.go +++ b/cdp/types.go @@ -3,8 +3,10 @@ package cdp // Code generated by cdproto-gen. DO NOT EDIT. import ( + "bytes" "context" "fmt" + "io" "strconv" "strings" "sync" @@ -496,64 +498,121 @@ func (n *Node) FullXPath() string { return n.xpath(false, false) } -// Dump builds a printable string representation of the node and its children. -func (n *Node) Dump(prefix, indent string, nodeIDs bool) string { +// WriteTo writes a readable representation of the node and all its children to w. +func (n *Node) WriteTo(w io.Writer, prefix, indent string, nodeIDs bool) (int, error) { if n == nil { - return prefix + "" + return w.Write([]byte(prefix + "")) } n.RLock() defer n.RUnlock() - s := n.LocalName - if s == "" { - s = n.NodeName + var err error + var nn, c int + + // prefix + if c, err = w.Write([]byte(prefix)); err != nil { + return nn + c, err } + nn += c + // node name + if n.LocalName != "" { + if c, err = w.Write([]byte(n.LocalName)); err != nil { + return nn + c, err + } + nn += c + } else { + if c, err = w.Write([]byte(n.NodeName)); err != nil { + return nn + c, err + } + nn += c + } + + // add #id + var hasID int for i := 0; i < len(n.Attributes); i += 2 { if strings.ToLower(n.Attributes[i]) == "id" { - s += "#" + n.Attributes[i+1] + if c, err = w.Write([]byte("#" + n.Attributes[i+1])); err != nil { + return nn + c, err + } + nn += c + hasID = 2 break } } + // node type if n.NodeType != NodeTypeElement && n.NodeType != NodeTypeText { - s += fmt.Sprintf(" <%s>", n.NodeType) + if c, err = fmt.Fprintf(w, " <%s>", n.NodeType); err != nil { + return nn + c, err + } + nn += c } + // node value if n.NodeType == NodeTypeText { v := n.NodeValue if len(v) > 15 { v = v[:15] + "..." } - s += fmt.Sprintf(" %q", v) + if c, err = fmt.Fprintf(w, " %q", v); err != nil { + return nn + c, err + } + nn += c } - if n.NodeType == NodeTypeElement && len(n.Attributes) > 0 { - attrs := "" - for i := 0; i < len(n.Attributes); i += 2 { + // attributes + if n.NodeType == NodeTypeElement && len(n.Attributes) > hasID { + if c, err = w.Write([]byte(" [")); err != nil { + return nn + c, err + } + nn += c + for i, space := 0, ""; i < len(n.Attributes); i += 2 { if strings.ToLower(n.Attributes[i]) == "id" { continue } - if attrs != "" { - attrs += " " + if c, err = fmt.Fprintf(w, "%s%s=%q", space, n.Attributes[i], n.Attributes[i+1]); err != nil { + return nn + c, err + } + nn += c + if space == "" { + space = " " } - attrs += fmt.Sprintf("%s=%q", n.Attributes[i], n.Attributes[i+1]) } - if attrs != "" { - s += " [" + attrs + "]" + if c, err = w.Write([]byte{']'}); err != nil { + return nn + c, err } + nn += c } + // node id if nodeIDs { - s += fmt.Sprintf(" (%d)", n.NodeID) + if c, err = fmt.Fprintf(w, " (%d)", n.NodeID); err != nil { + return nn + c, err + } + nn += c } + // children for i := 0; i < len(n.Children); i++ { - s += "\n" + n.Children[i].Dump(prefix+indent, indent, nodeIDs) + if c, err = fmt.Fprintln(w); err != nil { + return nn + c, err + } + nn += c + if c, err = n.Children[i].WriteTo(w, prefix+indent, indent, nodeIDs); err != nil { + return nn + c, err + } + nn += c } + return nn, nil +} - return prefix + s +// Dump builds a printable string representation of the node and its children. +func (n *Node) Dump(prefix, indent string, nodeIDs bool) string { + var buf bytes.Buffer + _, _ = n.WriteTo(&buf, prefix, indent, nodeIDs) + return buf.String() } // NodeState is the state of a DOM node.