mirror of
https://github.com/stashapp/stash.git
synced 2025-12-19 05:14:38 +03:00
Add cdp support for xpath scrapers (#625)
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
785
vendor/github.com/chromedp/cdproto/cdp/easyjson.go
generated
vendored
Normal file
785
vendor/github.com/chromedp/cdproto/cdp/easyjson.go
generated
vendored
Normal file
@@ -0,0 +1,785 @@
|
||||
// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.
|
||||
|
||||
package cdp
|
||||
|
||||
import (
|
||||
json "encoding/json"
|
||||
easyjson "github.com/mailru/easyjson"
|
||||
jlexer "github.com/mailru/easyjson/jlexer"
|
||||
jwriter "github.com/mailru/easyjson/jwriter"
|
||||
)
|
||||
|
||||
// suppress unused package warning
|
||||
var (
|
||||
_ *json.RawMessage
|
||||
_ *jlexer.Lexer
|
||||
_ *jwriter.Writer
|
||||
_ easyjson.Marshaler
|
||||
)
|
||||
|
||||
func easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp(in *jlexer.Lexer, out *RGBA) {
|
||||
isTopLevel := in.IsStart()
|
||||
if in.IsNull() {
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
in.Skip()
|
||||
return
|
||||
}
|
||||
in.Delim('{')
|
||||
for !in.IsDelim('}') {
|
||||
key := in.UnsafeString()
|
||||
in.WantColon()
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
in.WantComma()
|
||||
continue
|
||||
}
|
||||
switch key {
|
||||
case "r":
|
||||
out.R = int64(in.Int64())
|
||||
case "g":
|
||||
out.G = int64(in.Int64())
|
||||
case "b":
|
||||
out.B = int64(in.Int64())
|
||||
case "a":
|
||||
out.A = float64(in.Float64())
|
||||
default:
|
||||
in.SkipRecursive()
|
||||
}
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim('}')
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
}
|
||||
func easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp(out *jwriter.Writer, in RGBA) {
|
||||
out.RawByte('{')
|
||||
first := true
|
||||
_ = first
|
||||
{
|
||||
const prefix string = ",\"r\":"
|
||||
out.RawString(prefix[1:])
|
||||
out.Int64(int64(in.R))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"g\":"
|
||||
out.RawString(prefix)
|
||||
out.Int64(int64(in.G))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"b\":"
|
||||
out.RawString(prefix)
|
||||
out.Int64(int64(in.B))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"a\":"
|
||||
out.RawString(prefix)
|
||||
out.Float64(float64(in.A))
|
||||
}
|
||||
out.RawByte('}')
|
||||
}
|
||||
|
||||
// MarshalJSON supports json.Marshaler interface
|
||||
func (v RGBA) MarshalJSON() ([]byte, error) {
|
||||
w := jwriter.Writer{}
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp(&w, v)
|
||||
return w.Buffer.BuildBytes(), w.Error
|
||||
}
|
||||
|
||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||
func (v RGBA) MarshalEasyJSON(w *jwriter.Writer) {
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp(w, v)
|
||||
}
|
||||
|
||||
// UnmarshalJSON supports json.Unmarshaler interface
|
||||
func (v *RGBA) UnmarshalJSON(data []byte) error {
|
||||
r := jlexer.Lexer{Data: data}
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp(&r, v)
|
||||
return r.Error()
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||
func (v *RGBA) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp(l, v)
|
||||
}
|
||||
func easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp1(in *jlexer.Lexer, out *Node) {
|
||||
isTopLevel := in.IsStart()
|
||||
if in.IsNull() {
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
in.Skip()
|
||||
return
|
||||
}
|
||||
in.Delim('{')
|
||||
for !in.IsDelim('}') {
|
||||
key := in.UnsafeString()
|
||||
in.WantColon()
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
in.WantComma()
|
||||
continue
|
||||
}
|
||||
switch key {
|
||||
case "nodeId":
|
||||
(out.NodeID).UnmarshalEasyJSON(in)
|
||||
case "parentId":
|
||||
(out.ParentID).UnmarshalEasyJSON(in)
|
||||
case "backendNodeId":
|
||||
(out.BackendNodeID).UnmarshalEasyJSON(in)
|
||||
case "nodeType":
|
||||
(out.NodeType).UnmarshalEasyJSON(in)
|
||||
case "nodeName":
|
||||
out.NodeName = string(in.String())
|
||||
case "localName":
|
||||
out.LocalName = string(in.String())
|
||||
case "nodeValue":
|
||||
out.NodeValue = string(in.String())
|
||||
case "childNodeCount":
|
||||
out.ChildNodeCount = int64(in.Int64())
|
||||
case "children":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.Children = nil
|
||||
} else {
|
||||
in.Delim('[')
|
||||
if out.Children == nil {
|
||||
if !in.IsDelim(']') {
|
||||
out.Children = make([]*Node, 0, 8)
|
||||
} else {
|
||||
out.Children = []*Node{}
|
||||
}
|
||||
} else {
|
||||
out.Children = (out.Children)[:0]
|
||||
}
|
||||
for !in.IsDelim(']') {
|
||||
var v1 *Node
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
v1 = nil
|
||||
} else {
|
||||
if v1 == nil {
|
||||
v1 = new(Node)
|
||||
}
|
||||
(*v1).UnmarshalEasyJSON(in)
|
||||
}
|
||||
out.Children = append(out.Children, v1)
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim(']')
|
||||
}
|
||||
case "attributes":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.Attributes = nil
|
||||
} else {
|
||||
in.Delim('[')
|
||||
if out.Attributes == nil {
|
||||
if !in.IsDelim(']') {
|
||||
out.Attributes = make([]string, 0, 4)
|
||||
} else {
|
||||
out.Attributes = []string{}
|
||||
}
|
||||
} else {
|
||||
out.Attributes = (out.Attributes)[:0]
|
||||
}
|
||||
for !in.IsDelim(']') {
|
||||
var v2 string
|
||||
v2 = string(in.String())
|
||||
out.Attributes = append(out.Attributes, v2)
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim(']')
|
||||
}
|
||||
case "documentURL":
|
||||
out.DocumentURL = string(in.String())
|
||||
case "baseURL":
|
||||
out.BaseURL = string(in.String())
|
||||
case "publicId":
|
||||
out.PublicID = string(in.String())
|
||||
case "systemId":
|
||||
out.SystemID = string(in.String())
|
||||
case "internalSubset":
|
||||
out.InternalSubset = string(in.String())
|
||||
case "xmlVersion":
|
||||
out.XMLVersion = string(in.String())
|
||||
case "name":
|
||||
out.Name = string(in.String())
|
||||
case "value":
|
||||
out.Value = string(in.String())
|
||||
case "pseudoType":
|
||||
(out.PseudoType).UnmarshalEasyJSON(in)
|
||||
case "shadowRootType":
|
||||
(out.ShadowRootType).UnmarshalEasyJSON(in)
|
||||
case "frameId":
|
||||
(out.FrameID).UnmarshalEasyJSON(in)
|
||||
case "contentDocument":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.ContentDocument = nil
|
||||
} else {
|
||||
if out.ContentDocument == nil {
|
||||
out.ContentDocument = new(Node)
|
||||
}
|
||||
(*out.ContentDocument).UnmarshalEasyJSON(in)
|
||||
}
|
||||
case "shadowRoots":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.ShadowRoots = nil
|
||||
} else {
|
||||
in.Delim('[')
|
||||
if out.ShadowRoots == nil {
|
||||
if !in.IsDelim(']') {
|
||||
out.ShadowRoots = make([]*Node, 0, 8)
|
||||
} else {
|
||||
out.ShadowRoots = []*Node{}
|
||||
}
|
||||
} else {
|
||||
out.ShadowRoots = (out.ShadowRoots)[:0]
|
||||
}
|
||||
for !in.IsDelim(']') {
|
||||
var v3 *Node
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
v3 = nil
|
||||
} else {
|
||||
if v3 == nil {
|
||||
v3 = new(Node)
|
||||
}
|
||||
(*v3).UnmarshalEasyJSON(in)
|
||||
}
|
||||
out.ShadowRoots = append(out.ShadowRoots, v3)
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim(']')
|
||||
}
|
||||
case "templateContent":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.TemplateContent = nil
|
||||
} else {
|
||||
if out.TemplateContent == nil {
|
||||
out.TemplateContent = new(Node)
|
||||
}
|
||||
(*out.TemplateContent).UnmarshalEasyJSON(in)
|
||||
}
|
||||
case "pseudoElements":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.PseudoElements = nil
|
||||
} else {
|
||||
in.Delim('[')
|
||||
if out.PseudoElements == nil {
|
||||
if !in.IsDelim(']') {
|
||||
out.PseudoElements = make([]*Node, 0, 8)
|
||||
} else {
|
||||
out.PseudoElements = []*Node{}
|
||||
}
|
||||
} else {
|
||||
out.PseudoElements = (out.PseudoElements)[:0]
|
||||
}
|
||||
for !in.IsDelim(']') {
|
||||
var v4 *Node
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
v4 = nil
|
||||
} else {
|
||||
if v4 == nil {
|
||||
v4 = new(Node)
|
||||
}
|
||||
(*v4).UnmarshalEasyJSON(in)
|
||||
}
|
||||
out.PseudoElements = append(out.PseudoElements, v4)
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim(']')
|
||||
}
|
||||
case "importedDocument":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.ImportedDocument = nil
|
||||
} else {
|
||||
if out.ImportedDocument == nil {
|
||||
out.ImportedDocument = new(Node)
|
||||
}
|
||||
(*out.ImportedDocument).UnmarshalEasyJSON(in)
|
||||
}
|
||||
case "distributedNodes":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
out.DistributedNodes = nil
|
||||
} else {
|
||||
in.Delim('[')
|
||||
if out.DistributedNodes == nil {
|
||||
if !in.IsDelim(']') {
|
||||
out.DistributedNodes = make([]*BackendNode, 0, 8)
|
||||
} else {
|
||||
out.DistributedNodes = []*BackendNode{}
|
||||
}
|
||||
} else {
|
||||
out.DistributedNodes = (out.DistributedNodes)[:0]
|
||||
}
|
||||
for !in.IsDelim(']') {
|
||||
var v5 *BackendNode
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
v5 = nil
|
||||
} else {
|
||||
if v5 == nil {
|
||||
v5 = new(BackendNode)
|
||||
}
|
||||
(*v5).UnmarshalEasyJSON(in)
|
||||
}
|
||||
out.DistributedNodes = append(out.DistributedNodes, v5)
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim(']')
|
||||
}
|
||||
case "isSVG":
|
||||
out.IsSVG = bool(in.Bool())
|
||||
default:
|
||||
in.SkipRecursive()
|
||||
}
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim('}')
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
}
|
||||
func easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp1(out *jwriter.Writer, in Node) {
|
||||
out.RawByte('{')
|
||||
first := true
|
||||
_ = first
|
||||
{
|
||||
const prefix string = ",\"nodeId\":"
|
||||
out.RawString(prefix[1:])
|
||||
out.Int64(int64(in.NodeID))
|
||||
}
|
||||
if in.ParentID != 0 {
|
||||
const prefix string = ",\"parentId\":"
|
||||
out.RawString(prefix)
|
||||
out.Int64(int64(in.ParentID))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"backendNodeId\":"
|
||||
out.RawString(prefix)
|
||||
out.Int64(int64(in.BackendNodeID))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"nodeType\":"
|
||||
out.RawString(prefix)
|
||||
(in.NodeType).MarshalEasyJSON(out)
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"nodeName\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.NodeName))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"localName\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.LocalName))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"nodeValue\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.NodeValue))
|
||||
}
|
||||
if in.ChildNodeCount != 0 {
|
||||
const prefix string = ",\"childNodeCount\":"
|
||||
out.RawString(prefix)
|
||||
out.Int64(int64(in.ChildNodeCount))
|
||||
}
|
||||
if len(in.Children) != 0 {
|
||||
const prefix string = ",\"children\":"
|
||||
out.RawString(prefix)
|
||||
{
|
||||
out.RawByte('[')
|
||||
for v6, v7 := range in.Children {
|
||||
if v6 > 0 {
|
||||
out.RawByte(',')
|
||||
}
|
||||
if v7 == nil {
|
||||
out.RawString("null")
|
||||
} else {
|
||||
(*v7).MarshalEasyJSON(out)
|
||||
}
|
||||
}
|
||||
out.RawByte(']')
|
||||
}
|
||||
}
|
||||
if len(in.Attributes) != 0 {
|
||||
const prefix string = ",\"attributes\":"
|
||||
out.RawString(prefix)
|
||||
{
|
||||
out.RawByte('[')
|
||||
for v8, v9 := range in.Attributes {
|
||||
if v8 > 0 {
|
||||
out.RawByte(',')
|
||||
}
|
||||
out.String(string(v9))
|
||||
}
|
||||
out.RawByte(']')
|
||||
}
|
||||
}
|
||||
if in.DocumentURL != "" {
|
||||
const prefix string = ",\"documentURL\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.DocumentURL))
|
||||
}
|
||||
if in.BaseURL != "" {
|
||||
const prefix string = ",\"baseURL\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.BaseURL))
|
||||
}
|
||||
if in.PublicID != "" {
|
||||
const prefix string = ",\"publicId\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.PublicID))
|
||||
}
|
||||
if in.SystemID != "" {
|
||||
const prefix string = ",\"systemId\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.SystemID))
|
||||
}
|
||||
if in.InternalSubset != "" {
|
||||
const prefix string = ",\"internalSubset\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.InternalSubset))
|
||||
}
|
||||
if in.XMLVersion != "" {
|
||||
const prefix string = ",\"xmlVersion\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.XMLVersion))
|
||||
}
|
||||
if in.Name != "" {
|
||||
const prefix string = ",\"name\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.Name))
|
||||
}
|
||||
if in.Value != "" {
|
||||
const prefix string = ",\"value\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.Value))
|
||||
}
|
||||
if in.PseudoType != "" {
|
||||
const prefix string = ",\"pseudoType\":"
|
||||
out.RawString(prefix)
|
||||
(in.PseudoType).MarshalEasyJSON(out)
|
||||
}
|
||||
if in.ShadowRootType != "" {
|
||||
const prefix string = ",\"shadowRootType\":"
|
||||
out.RawString(prefix)
|
||||
(in.ShadowRootType).MarshalEasyJSON(out)
|
||||
}
|
||||
if in.FrameID != "" {
|
||||
const prefix string = ",\"frameId\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.FrameID))
|
||||
}
|
||||
if in.ContentDocument != nil {
|
||||
const prefix string = ",\"contentDocument\":"
|
||||
out.RawString(prefix)
|
||||
(*in.ContentDocument).MarshalEasyJSON(out)
|
||||
}
|
||||
if len(in.ShadowRoots) != 0 {
|
||||
const prefix string = ",\"shadowRoots\":"
|
||||
out.RawString(prefix)
|
||||
{
|
||||
out.RawByte('[')
|
||||
for v10, v11 := range in.ShadowRoots {
|
||||
if v10 > 0 {
|
||||
out.RawByte(',')
|
||||
}
|
||||
if v11 == nil {
|
||||
out.RawString("null")
|
||||
} else {
|
||||
(*v11).MarshalEasyJSON(out)
|
||||
}
|
||||
}
|
||||
out.RawByte(']')
|
||||
}
|
||||
}
|
||||
if in.TemplateContent != nil {
|
||||
const prefix string = ",\"templateContent\":"
|
||||
out.RawString(prefix)
|
||||
(*in.TemplateContent).MarshalEasyJSON(out)
|
||||
}
|
||||
if len(in.PseudoElements) != 0 {
|
||||
const prefix string = ",\"pseudoElements\":"
|
||||
out.RawString(prefix)
|
||||
{
|
||||
out.RawByte('[')
|
||||
for v12, v13 := range in.PseudoElements {
|
||||
if v12 > 0 {
|
||||
out.RawByte(',')
|
||||
}
|
||||
if v13 == nil {
|
||||
out.RawString("null")
|
||||
} else {
|
||||
(*v13).MarshalEasyJSON(out)
|
||||
}
|
||||
}
|
||||
out.RawByte(']')
|
||||
}
|
||||
}
|
||||
if in.ImportedDocument != nil {
|
||||
const prefix string = ",\"importedDocument\":"
|
||||
out.RawString(prefix)
|
||||
(*in.ImportedDocument).MarshalEasyJSON(out)
|
||||
}
|
||||
if len(in.DistributedNodes) != 0 {
|
||||
const prefix string = ",\"distributedNodes\":"
|
||||
out.RawString(prefix)
|
||||
{
|
||||
out.RawByte('[')
|
||||
for v14, v15 := range in.DistributedNodes {
|
||||
if v14 > 0 {
|
||||
out.RawByte(',')
|
||||
}
|
||||
if v15 == nil {
|
||||
out.RawString("null")
|
||||
} else {
|
||||
(*v15).MarshalEasyJSON(out)
|
||||
}
|
||||
}
|
||||
out.RawByte(']')
|
||||
}
|
||||
}
|
||||
if in.IsSVG {
|
||||
const prefix string = ",\"isSVG\":"
|
||||
out.RawString(prefix)
|
||||
out.Bool(bool(in.IsSVG))
|
||||
}
|
||||
out.RawByte('}')
|
||||
}
|
||||
|
||||
// MarshalJSON supports json.Marshaler interface
|
||||
func (v Node) MarshalJSON() ([]byte, error) {
|
||||
w := jwriter.Writer{}
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp1(&w, v)
|
||||
return w.Buffer.BuildBytes(), w.Error
|
||||
}
|
||||
|
||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||
func (v Node) MarshalEasyJSON(w *jwriter.Writer) {
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp1(w, v)
|
||||
}
|
||||
|
||||
// UnmarshalJSON supports json.Unmarshaler interface
|
||||
func (v *Node) UnmarshalJSON(data []byte) error {
|
||||
r := jlexer.Lexer{Data: data}
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp1(&r, v)
|
||||
return r.Error()
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||
func (v *Node) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp1(l, v)
|
||||
}
|
||||
func easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp2(in *jlexer.Lexer, out *Frame) {
|
||||
isTopLevel := in.IsStart()
|
||||
if in.IsNull() {
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
in.Skip()
|
||||
return
|
||||
}
|
||||
in.Delim('{')
|
||||
for !in.IsDelim('}') {
|
||||
key := in.UnsafeString()
|
||||
in.WantColon()
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
in.WantComma()
|
||||
continue
|
||||
}
|
||||
switch key {
|
||||
case "id":
|
||||
(out.ID).UnmarshalEasyJSON(in)
|
||||
case "parentId":
|
||||
(out.ParentID).UnmarshalEasyJSON(in)
|
||||
case "loaderId":
|
||||
out.LoaderID = LoaderID(in.String())
|
||||
case "name":
|
||||
out.Name = string(in.String())
|
||||
case "url":
|
||||
out.URL = string(in.String())
|
||||
case "urlFragment":
|
||||
out.URLFragment = string(in.String())
|
||||
case "securityOrigin":
|
||||
out.SecurityOrigin = string(in.String())
|
||||
case "mimeType":
|
||||
out.MimeType = string(in.String())
|
||||
case "unreachableUrl":
|
||||
out.UnreachableURL = string(in.String())
|
||||
default:
|
||||
in.SkipRecursive()
|
||||
}
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim('}')
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
}
|
||||
func easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp2(out *jwriter.Writer, in Frame) {
|
||||
out.RawByte('{')
|
||||
first := true
|
||||
_ = first
|
||||
{
|
||||
const prefix string = ",\"id\":"
|
||||
out.RawString(prefix[1:])
|
||||
out.String(string(in.ID))
|
||||
}
|
||||
if in.ParentID != "" {
|
||||
const prefix string = ",\"parentId\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.ParentID))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"loaderId\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.LoaderID))
|
||||
}
|
||||
if in.Name != "" {
|
||||
const prefix string = ",\"name\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.Name))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"url\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.URL))
|
||||
}
|
||||
if in.URLFragment != "" {
|
||||
const prefix string = ",\"urlFragment\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.URLFragment))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"securityOrigin\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.SecurityOrigin))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"mimeType\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.MimeType))
|
||||
}
|
||||
if in.UnreachableURL != "" {
|
||||
const prefix string = ",\"unreachableUrl\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.UnreachableURL))
|
||||
}
|
||||
out.RawByte('}')
|
||||
}
|
||||
|
||||
// MarshalJSON supports json.Marshaler interface
|
||||
func (v Frame) MarshalJSON() ([]byte, error) {
|
||||
w := jwriter.Writer{}
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp2(&w, v)
|
||||
return w.Buffer.BuildBytes(), w.Error
|
||||
}
|
||||
|
||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||
func (v Frame) MarshalEasyJSON(w *jwriter.Writer) {
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp2(w, v)
|
||||
}
|
||||
|
||||
// UnmarshalJSON supports json.Unmarshaler interface
|
||||
func (v *Frame) UnmarshalJSON(data []byte) error {
|
||||
r := jlexer.Lexer{Data: data}
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp2(&r, v)
|
||||
return r.Error()
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||
func (v *Frame) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp2(l, v)
|
||||
}
|
||||
func easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp3(in *jlexer.Lexer, out *BackendNode) {
|
||||
isTopLevel := in.IsStart()
|
||||
if in.IsNull() {
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
in.Skip()
|
||||
return
|
||||
}
|
||||
in.Delim('{')
|
||||
for !in.IsDelim('}') {
|
||||
key := in.UnsafeString()
|
||||
in.WantColon()
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
in.WantComma()
|
||||
continue
|
||||
}
|
||||
switch key {
|
||||
case "nodeType":
|
||||
(out.NodeType).UnmarshalEasyJSON(in)
|
||||
case "nodeName":
|
||||
out.NodeName = string(in.String())
|
||||
case "backendNodeId":
|
||||
(out.BackendNodeID).UnmarshalEasyJSON(in)
|
||||
default:
|
||||
in.SkipRecursive()
|
||||
}
|
||||
in.WantComma()
|
||||
}
|
||||
in.Delim('}')
|
||||
if isTopLevel {
|
||||
in.Consumed()
|
||||
}
|
||||
}
|
||||
func easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp3(out *jwriter.Writer, in BackendNode) {
|
||||
out.RawByte('{')
|
||||
first := true
|
||||
_ = first
|
||||
{
|
||||
const prefix string = ",\"nodeType\":"
|
||||
out.RawString(prefix[1:])
|
||||
(in.NodeType).MarshalEasyJSON(out)
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"nodeName\":"
|
||||
out.RawString(prefix)
|
||||
out.String(string(in.NodeName))
|
||||
}
|
||||
{
|
||||
const prefix string = ",\"backendNodeId\":"
|
||||
out.RawString(prefix)
|
||||
out.Int64(int64(in.BackendNodeID))
|
||||
}
|
||||
out.RawByte('}')
|
||||
}
|
||||
|
||||
// MarshalJSON supports json.Marshaler interface
|
||||
func (v BackendNode) MarshalJSON() ([]byte, error) {
|
||||
w := jwriter.Writer{}
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp3(&w, v)
|
||||
return w.Buffer.BuildBytes(), w.Error
|
||||
}
|
||||
|
||||
// MarshalEasyJSON supports easyjson.Marshaler interface
|
||||
func (v BackendNode) MarshalEasyJSON(w *jwriter.Writer) {
|
||||
easyjsonC5a4559bEncodeGithubComChromedpCdprotoCdp3(w, v)
|
||||
}
|
||||
|
||||
// UnmarshalJSON supports json.Unmarshaler interface
|
||||
func (v *BackendNode) UnmarshalJSON(data []byte) error {
|
||||
r := jlexer.Lexer{Data: data}
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp3(&r, v)
|
||||
return r.Error()
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
|
||||
func (v *BackendNode) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
||||
easyjsonC5a4559bDecodeGithubComChromedpCdprotoCdp3(l, v)
|
||||
}
|
||||
787
vendor/github.com/chromedp/cdproto/cdp/types.go
generated
vendored
Normal file
787
vendor/github.com/chromedp/cdproto/cdp/types.go
generated
vendored
Normal file
@@ -0,0 +1,787 @@
|
||||
package cdp
|
||||
|
||||
// Code generated by cdproto-gen. DO NOT EDIT.
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/knq/sysutil"
|
||||
"github.com/mailru/easyjson"
|
||||
"github.com/mailru/easyjson/jlexer"
|
||||
"github.com/mailru/easyjson/jwriter"
|
||||
)
|
||||
|
||||
// Executor is the common interface for executing a command.
|
||||
type Executor interface {
|
||||
// Execute executes the command.
|
||||
Execute(context.Context, string, easyjson.Marshaler, easyjson.Unmarshaler) error
|
||||
}
|
||||
|
||||
// contextKey is the context key type.
|
||||
type contextKey int
|
||||
|
||||
// context keys.
|
||||
const (
|
||||
executorKey contextKey = iota
|
||||
)
|
||||
|
||||
// WithExecutor sets the message executor for the context.
|
||||
func WithExecutor(parent context.Context, executor Executor) context.Context {
|
||||
return context.WithValue(parent, executorKey, executor)
|
||||
}
|
||||
|
||||
// ExecutorFromContext returns the message executor for the context.
|
||||
func ExecutorFromContext(ctx context.Context) Executor {
|
||||
return ctx.Value(executorKey).(Executor)
|
||||
}
|
||||
|
||||
// Execute uses the context's message executor to send a command or event
|
||||
// method marshaling the provided parameters, and unmarshaling to res.
|
||||
func Execute(ctx context.Context, method string, params easyjson.Marshaler, res easyjson.Unmarshaler) error {
|
||||
if executor := ctx.Value(executorKey); executor != nil {
|
||||
return executor.(Executor).Execute(ctx, method, params, res)
|
||||
}
|
||||
return ErrInvalidContext
|
||||
}
|
||||
|
||||
// Error is a error.
|
||||
type Error string
|
||||
|
||||
// Error values.
|
||||
const (
|
||||
// ErrInvalidContext is the invalid context error.
|
||||
ErrInvalidContext Error = "invalid context"
|
||||
|
||||
// ErrMsgMissingParamsOrResult is the msg missing params or result error.
|
||||
ErrMsgMissingParamsOrResult Error = "msg missing params or result"
|
||||
)
|
||||
|
||||
// Error satisfies the error interface.
|
||||
func (err Error) Error() string {
|
||||
return string(err)
|
||||
}
|
||||
|
||||
// ErrUnknownCommandOrEvent is an unknown command or event error.
|
||||
type ErrUnknownCommandOrEvent string
|
||||
|
||||
// Error satisfies the error interface.
|
||||
func (err ErrUnknownCommandOrEvent) Error() string {
|
||||
return fmt.Sprintf("unknown command or event %q", string(err))
|
||||
}
|
||||
|
||||
// BrowserContextID [no description].
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/Browser#type-BrowserContextID
|
||||
type BrowserContextID string
|
||||
|
||||
// String returns the BrowserContextID as string value.
|
||||
func (t BrowserContextID) String() string {
|
||||
return string(t)
|
||||
}
|
||||
|
||||
// NodeID unique DOM node identifier.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/DOM#type-NodeId
|
||||
type NodeID int64
|
||||
|
||||
// Int64 returns the NodeID as int64 value.
|
||||
func (t NodeID) Int64() int64 {
|
||||
return int64(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *NodeID) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
buf := in.Raw()
|
||||
if l := len(buf); l > 2 && buf[0] == '"' && buf[l-1] == '"' {
|
||||
buf = buf[1 : l-1]
|
||||
}
|
||||
|
||||
v, err := strconv.ParseInt(string(buf), 10, 64)
|
||||
if err != nil {
|
||||
in.AddError(err)
|
||||
}
|
||||
|
||||
*t = NodeID(v)
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *NodeID) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// BackendNodeID unique DOM node identifier used to reference a node that may
|
||||
// not have been pushed to the front-end.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/DOM#type-BackendNodeId
|
||||
type BackendNodeID int64
|
||||
|
||||
// Int64 returns the BackendNodeID as int64 value.
|
||||
func (t BackendNodeID) Int64() int64 {
|
||||
return int64(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *BackendNodeID) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
buf := in.Raw()
|
||||
if l := len(buf); l > 2 && buf[0] == '"' && buf[l-1] == '"' {
|
||||
buf = buf[1 : l-1]
|
||||
}
|
||||
|
||||
v, err := strconv.ParseInt(string(buf), 10, 64)
|
||||
if err != nil {
|
||||
in.AddError(err)
|
||||
}
|
||||
|
||||
*t = BackendNodeID(v)
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *BackendNodeID) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// BackendNode backend node with a friendly name.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/DOM#type-BackendNode
|
||||
type BackendNode struct {
|
||||
NodeType NodeType `json:"nodeType"` // Node's nodeType.
|
||||
NodeName string `json:"nodeName"` // Node's nodeName.
|
||||
BackendNodeID BackendNodeID `json:"backendNodeId"`
|
||||
}
|
||||
|
||||
// PseudoType pseudo element type.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/DOM#type-PseudoType
|
||||
type PseudoType string
|
||||
|
||||
// String returns the PseudoType as string value.
|
||||
func (t PseudoType) String() string {
|
||||
return string(t)
|
||||
}
|
||||
|
||||
// PseudoType values.
|
||||
const (
|
||||
PseudoTypeFirstLine PseudoType = "first-line"
|
||||
PseudoTypeFirstLetter PseudoType = "first-letter"
|
||||
PseudoTypeBefore PseudoType = "before"
|
||||
PseudoTypeAfter PseudoType = "after"
|
||||
PseudoTypeMarker PseudoType = "marker"
|
||||
PseudoTypeBackdrop PseudoType = "backdrop"
|
||||
PseudoTypeSelection PseudoType = "selection"
|
||||
PseudoTypeFirstLineInherited PseudoType = "first-line-inherited"
|
||||
PseudoTypeScrollbar PseudoType = "scrollbar"
|
||||
PseudoTypeScrollbarThumb PseudoType = "scrollbar-thumb"
|
||||
PseudoTypeScrollbarButton PseudoType = "scrollbar-button"
|
||||
PseudoTypeScrollbarTrack PseudoType = "scrollbar-track"
|
||||
PseudoTypeScrollbarTrackPiece PseudoType = "scrollbar-track-piece"
|
||||
PseudoTypeScrollbarCorner PseudoType = "scrollbar-corner"
|
||||
PseudoTypeResizer PseudoType = "resizer"
|
||||
PseudoTypeInputListButton PseudoType = "input-list-button"
|
||||
)
|
||||
|
||||
// MarshalEasyJSON satisfies easyjson.Marshaler.
|
||||
func (t PseudoType) MarshalEasyJSON(out *jwriter.Writer) {
|
||||
out.String(string(t))
|
||||
}
|
||||
|
||||
// MarshalJSON satisfies json.Marshaler.
|
||||
func (t PseudoType) MarshalJSON() ([]byte, error) {
|
||||
return easyjson.Marshal(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *PseudoType) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
switch PseudoType(in.String()) {
|
||||
case PseudoTypeFirstLine:
|
||||
*t = PseudoTypeFirstLine
|
||||
case PseudoTypeFirstLetter:
|
||||
*t = PseudoTypeFirstLetter
|
||||
case PseudoTypeBefore:
|
||||
*t = PseudoTypeBefore
|
||||
case PseudoTypeAfter:
|
||||
*t = PseudoTypeAfter
|
||||
case PseudoTypeMarker:
|
||||
*t = PseudoTypeMarker
|
||||
case PseudoTypeBackdrop:
|
||||
*t = PseudoTypeBackdrop
|
||||
case PseudoTypeSelection:
|
||||
*t = PseudoTypeSelection
|
||||
case PseudoTypeFirstLineInherited:
|
||||
*t = PseudoTypeFirstLineInherited
|
||||
case PseudoTypeScrollbar:
|
||||
*t = PseudoTypeScrollbar
|
||||
case PseudoTypeScrollbarThumb:
|
||||
*t = PseudoTypeScrollbarThumb
|
||||
case PseudoTypeScrollbarButton:
|
||||
*t = PseudoTypeScrollbarButton
|
||||
case PseudoTypeScrollbarTrack:
|
||||
*t = PseudoTypeScrollbarTrack
|
||||
case PseudoTypeScrollbarTrackPiece:
|
||||
*t = PseudoTypeScrollbarTrackPiece
|
||||
case PseudoTypeScrollbarCorner:
|
||||
*t = PseudoTypeScrollbarCorner
|
||||
case PseudoTypeResizer:
|
||||
*t = PseudoTypeResizer
|
||||
case PseudoTypeInputListButton:
|
||||
*t = PseudoTypeInputListButton
|
||||
|
||||
default:
|
||||
in.AddError(errors.New("unknown PseudoType value"))
|
||||
}
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *PseudoType) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// ShadowRootType shadow root type.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/DOM#type-ShadowRootType
|
||||
type ShadowRootType string
|
||||
|
||||
// String returns the ShadowRootType as string value.
|
||||
func (t ShadowRootType) String() string {
|
||||
return string(t)
|
||||
}
|
||||
|
||||
// ShadowRootType values.
|
||||
const (
|
||||
ShadowRootTypeUserAgent ShadowRootType = "user-agent"
|
||||
ShadowRootTypeOpen ShadowRootType = "open"
|
||||
ShadowRootTypeClosed ShadowRootType = "closed"
|
||||
)
|
||||
|
||||
// MarshalEasyJSON satisfies easyjson.Marshaler.
|
||||
func (t ShadowRootType) MarshalEasyJSON(out *jwriter.Writer) {
|
||||
out.String(string(t))
|
||||
}
|
||||
|
||||
// MarshalJSON satisfies json.Marshaler.
|
||||
func (t ShadowRootType) MarshalJSON() ([]byte, error) {
|
||||
return easyjson.Marshal(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *ShadowRootType) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
switch ShadowRootType(in.String()) {
|
||||
case ShadowRootTypeUserAgent:
|
||||
*t = ShadowRootTypeUserAgent
|
||||
case ShadowRootTypeOpen:
|
||||
*t = ShadowRootTypeOpen
|
||||
case ShadowRootTypeClosed:
|
||||
*t = ShadowRootTypeClosed
|
||||
|
||||
default:
|
||||
in.AddError(errors.New("unknown ShadowRootType value"))
|
||||
}
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *ShadowRootType) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// Node DOM interaction is implemented in terms of mirror objects that
|
||||
// represent the actual DOM nodes. DOMNode is a base node mirror type.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/DOM#type-Node
|
||||
type Node struct {
|
||||
NodeID NodeID `json:"nodeId"` // Node identifier that is passed into the rest of the DOM messages as the nodeId. Backend will only push node with given id once. It is aware of all requested nodes and will only fire DOM events for nodes known to the client.
|
||||
ParentID NodeID `json:"parentId,omitempty"` // The id of the parent node if any.
|
||||
BackendNodeID BackendNodeID `json:"backendNodeId"` // The BackendNodeId for this node.
|
||||
NodeType NodeType `json:"nodeType"` // Node's nodeType.
|
||||
NodeName string `json:"nodeName"` // Node's nodeName.
|
||||
LocalName string `json:"localName"` // Node's localName.
|
||||
NodeValue string `json:"nodeValue"` // Node's nodeValue.
|
||||
ChildNodeCount int64 `json:"childNodeCount,omitempty"` // Child count for Container nodes.
|
||||
Children []*Node `json:"children,omitempty"` // Child nodes of this node when requested with children.
|
||||
Attributes []string `json:"attributes,omitempty"` // Attributes of the Element node in the form of flat array [name1, value1, name2, value2].
|
||||
DocumentURL string `json:"documentURL,omitempty"` // Document URL that Document or FrameOwner node points to.
|
||||
BaseURL string `json:"baseURL,omitempty"` // Base URL that Document or FrameOwner node uses for URL completion.
|
||||
PublicID string `json:"publicId,omitempty"` // DocumentType's publicId.
|
||||
SystemID string `json:"systemId,omitempty"` // DocumentType's systemId.
|
||||
InternalSubset string `json:"internalSubset,omitempty"` // DocumentType's internalSubset.
|
||||
XMLVersion string `json:"xmlVersion,omitempty"` // Document's XML version in case of XML documents.
|
||||
Name string `json:"name,omitempty"` // Attr's name.
|
||||
Value string `json:"value,omitempty"` // Attr's value.
|
||||
PseudoType PseudoType `json:"pseudoType,omitempty"` // Pseudo element type for this node.
|
||||
ShadowRootType ShadowRootType `json:"shadowRootType,omitempty"` // Shadow root type.
|
||||
FrameID FrameID `json:"frameId,omitempty"` // Frame ID for frame owner elements.
|
||||
ContentDocument *Node `json:"contentDocument,omitempty"` // Content document for frame owner elements.
|
||||
ShadowRoots []*Node `json:"shadowRoots,omitempty"` // Shadow root list for given element host.
|
||||
TemplateContent *Node `json:"templateContent,omitempty"` // Content document fragment for template elements.
|
||||
PseudoElements []*Node `json:"pseudoElements,omitempty"` // Pseudo elements associated with this node.
|
||||
ImportedDocument *Node `json:"importedDocument,omitempty"` // Import document for the HTMLImport links.
|
||||
DistributedNodes []*BackendNode `json:"distributedNodes,omitempty"` // Distributed nodes for given insertion point.
|
||||
IsSVG bool `json:"isSVG,omitempty"` // Whether the node is SVG.
|
||||
Parent *Node `json:"-"` // Parent node.
|
||||
Invalidated chan struct{} `json:"-"` // Invalidated channel.
|
||||
State NodeState `json:"-"` // Node state.
|
||||
sync.RWMutex `json:"-"` // Read write mutex.
|
||||
}
|
||||
|
||||
// AttributeValue returns the named attribute for the node.
|
||||
func (n *Node) AttributeValue(name string) string {
|
||||
n.RLock()
|
||||
defer n.RUnlock()
|
||||
|
||||
for i := 0; i < len(n.Attributes); i += 2 {
|
||||
if n.Attributes[i] == name {
|
||||
return n.Attributes[i+1]
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// xpath builds the xpath string.
|
||||
func (n *Node) xpath(stopAtDocument, stopAtID bool) string {
|
||||
n.RLock()
|
||||
defer n.RUnlock()
|
||||
|
||||
p, pos, id := "", "", n.AttributeValue("id")
|
||||
switch {
|
||||
case n.Parent == nil:
|
||||
return n.LocalName
|
||||
|
||||
case stopAtDocument && n.NodeType == NodeTypeDocument:
|
||||
return ""
|
||||
|
||||
case stopAtID && id != "":
|
||||
p = "/"
|
||||
pos = `[@id='` + id + `']`
|
||||
|
||||
case n.Parent != nil:
|
||||
var i int
|
||||
var found bool
|
||||
|
||||
n.Parent.RLock()
|
||||
for j := 0; j < len(n.Parent.Children); j++ {
|
||||
if n.Parent.Children[j].LocalName == n.LocalName {
|
||||
i++
|
||||
}
|
||||
if n.Parent.Children[j].NodeID == n.NodeID {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
n.Parent.RUnlock()
|
||||
|
||||
if found {
|
||||
pos = "[" + strconv.Itoa(i) + "]"
|
||||
}
|
||||
|
||||
p = n.Parent.xpath(stopAtDocument, stopAtID)
|
||||
}
|
||||
|
||||
localName := n.LocalName
|
||||
if n.IsSVG {
|
||||
localName = `*[local-name()='` + localName + `']`
|
||||
}
|
||||
return p + "/" + localName + pos
|
||||
}
|
||||
|
||||
// PartialXPathByID returns the partial XPath for the node, stopping at the
|
||||
// first parent with an id attribute or at nearest parent document node.
|
||||
func (n *Node) PartialXPathByID() string {
|
||||
return n.xpath(true, true)
|
||||
}
|
||||
|
||||
// PartialXPath returns the partial XPath for the node, stopping at the nearest
|
||||
// parent document node.
|
||||
func (n *Node) PartialXPath() string {
|
||||
return n.xpath(true, false)
|
||||
}
|
||||
|
||||
// FullXPathByID returns the full XPath for the node, stopping at the top most
|
||||
// document root or at the closest parent node with an id attribute.
|
||||
func (n *Node) FullXPathByID() string {
|
||||
return n.xpath(false, true)
|
||||
}
|
||||
|
||||
// FullXPath returns the full XPath for the node, stopping only at the top most
|
||||
// document root.
|
||||
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 {
|
||||
if n == nil {
|
||||
return prefix + "<nil>"
|
||||
}
|
||||
|
||||
n.RLock()
|
||||
defer n.RUnlock()
|
||||
|
||||
s := n.LocalName
|
||||
if s == "" {
|
||||
s = n.NodeName
|
||||
}
|
||||
|
||||
for i := 0; i < len(n.Attributes); i += 2 {
|
||||
if strings.ToLower(n.Attributes[i]) == "id" {
|
||||
s += "#" + n.Attributes[i+1]
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if n.NodeType != NodeTypeElement && n.NodeType != NodeTypeText {
|
||||
s += fmt.Sprintf(" <%s>", n.NodeType)
|
||||
}
|
||||
|
||||
if n.NodeType == NodeTypeText {
|
||||
v := n.NodeValue
|
||||
if len(v) > 15 {
|
||||
v = v[:15] + "..."
|
||||
}
|
||||
s += fmt.Sprintf(" %q", v)
|
||||
}
|
||||
|
||||
if n.NodeType == NodeTypeElement && len(n.Attributes) > 0 {
|
||||
attrs := ""
|
||||
for i := 0; i < len(n.Attributes); i += 2 {
|
||||
if strings.ToLower(n.Attributes[i]) == "id" {
|
||||
continue
|
||||
}
|
||||
if attrs != "" {
|
||||
attrs += " "
|
||||
}
|
||||
attrs += fmt.Sprintf("%s=%q", n.Attributes[i], n.Attributes[i+1])
|
||||
}
|
||||
if attrs != "" {
|
||||
s += " [" + attrs + "]"
|
||||
}
|
||||
}
|
||||
|
||||
if nodeIDs {
|
||||
s += fmt.Sprintf(" (%d)", n.NodeID)
|
||||
}
|
||||
|
||||
for i := 0; i < len(n.Children); i++ {
|
||||
s += "\n" + n.Children[i].Dump(prefix+indent, indent, nodeIDs)
|
||||
}
|
||||
|
||||
return prefix + s
|
||||
}
|
||||
|
||||
// NodeState is the state of a DOM node.
|
||||
type NodeState uint8
|
||||
|
||||
// NodeState enum values.
|
||||
const (
|
||||
NodeReady NodeState = 1 << (7 - iota)
|
||||
NodeVisible
|
||||
NodeHighlighted
|
||||
)
|
||||
|
||||
// nodeStateNames are the names of the node states.
|
||||
var nodeStateNames = map[NodeState]string{
|
||||
NodeReady: "Ready",
|
||||
NodeVisible: "Visible",
|
||||
NodeHighlighted: "Highlighted",
|
||||
}
|
||||
|
||||
// String satisfies stringer interface.
|
||||
func (ns NodeState) String() string {
|
||||
var s []string
|
||||
for k, v := range nodeStateNames {
|
||||
if ns&k != 0 {
|
||||
s = append(s, v)
|
||||
}
|
||||
}
|
||||
return "[" + strings.Join(s, " ") + "]"
|
||||
}
|
||||
|
||||
// EmptyNodeID is the "non-existent" node id.
|
||||
const EmptyNodeID = NodeID(0)
|
||||
|
||||
// RGBA a structure holding an RGBA color.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/DOM#type-RGBA
|
||||
type RGBA struct {
|
||||
R int64 `json:"r"` // The red component, in the [0-255] range.
|
||||
G int64 `json:"g"` // The green component, in the [0-255] range.
|
||||
B int64 `json:"b"` // The blue component, in the [0-255] range.
|
||||
A float64 `json:"a"` // The alpha component, in the [0-1] range (default: 1).
|
||||
}
|
||||
|
||||
// NodeType node type.
|
||||
//
|
||||
// See: https://developer.mozilla.org/en/docs/Web/API/Node/nodeType
|
||||
type NodeType int64
|
||||
|
||||
// Int64 returns the NodeType as int64 value.
|
||||
func (t NodeType) Int64() int64 {
|
||||
return int64(t)
|
||||
}
|
||||
|
||||
// NodeType values.
|
||||
const (
|
||||
NodeTypeElement NodeType = 1
|
||||
NodeTypeAttribute NodeType = 2
|
||||
NodeTypeText NodeType = 3
|
||||
NodeTypeCDATA NodeType = 4
|
||||
NodeTypeEntityReference NodeType = 5
|
||||
NodeTypeEntity NodeType = 6
|
||||
NodeTypeProcessingInstruction NodeType = 7
|
||||
NodeTypeComment NodeType = 8
|
||||
NodeTypeDocument NodeType = 9
|
||||
NodeTypeDocumentType NodeType = 10
|
||||
NodeTypeDocumentFragment NodeType = 11
|
||||
NodeTypeNotation NodeType = 12
|
||||
)
|
||||
|
||||
// String returns the NodeType as string value.
|
||||
func (t NodeType) String() string {
|
||||
switch t {
|
||||
case NodeTypeElement:
|
||||
return "Element"
|
||||
case NodeTypeAttribute:
|
||||
return "Attribute"
|
||||
case NodeTypeText:
|
||||
return "Text"
|
||||
case NodeTypeCDATA:
|
||||
return "CDATA"
|
||||
case NodeTypeEntityReference:
|
||||
return "EntityReference"
|
||||
case NodeTypeEntity:
|
||||
return "Entity"
|
||||
case NodeTypeProcessingInstruction:
|
||||
return "ProcessingInstruction"
|
||||
case NodeTypeComment:
|
||||
return "Comment"
|
||||
case NodeTypeDocument:
|
||||
return "Document"
|
||||
case NodeTypeDocumentType:
|
||||
return "DocumentType"
|
||||
case NodeTypeDocumentFragment:
|
||||
return "DocumentFragment"
|
||||
case NodeTypeNotation:
|
||||
return "Notation"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("NodeType(%d)", t)
|
||||
}
|
||||
|
||||
// MarshalEasyJSON satisfies easyjson.Marshaler.
|
||||
func (t NodeType) MarshalEasyJSON(out *jwriter.Writer) {
|
||||
out.Int64(int64(t))
|
||||
}
|
||||
|
||||
// MarshalJSON satisfies json.Marshaler.
|
||||
func (t NodeType) MarshalJSON() ([]byte, error) {
|
||||
return easyjson.Marshal(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *NodeType) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
switch NodeType(in.Int64()) {
|
||||
case NodeTypeElement:
|
||||
*t = NodeTypeElement
|
||||
case NodeTypeAttribute:
|
||||
*t = NodeTypeAttribute
|
||||
case NodeTypeText:
|
||||
*t = NodeTypeText
|
||||
case NodeTypeCDATA:
|
||||
*t = NodeTypeCDATA
|
||||
case NodeTypeEntityReference:
|
||||
*t = NodeTypeEntityReference
|
||||
case NodeTypeEntity:
|
||||
*t = NodeTypeEntity
|
||||
case NodeTypeProcessingInstruction:
|
||||
*t = NodeTypeProcessingInstruction
|
||||
case NodeTypeComment:
|
||||
*t = NodeTypeComment
|
||||
case NodeTypeDocument:
|
||||
*t = NodeTypeDocument
|
||||
case NodeTypeDocumentType:
|
||||
*t = NodeTypeDocumentType
|
||||
case NodeTypeDocumentFragment:
|
||||
*t = NodeTypeDocumentFragment
|
||||
case NodeTypeNotation:
|
||||
*t = NodeTypeNotation
|
||||
|
||||
default:
|
||||
in.AddError(errors.New("unknown NodeType value"))
|
||||
}
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *NodeType) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// LoaderID unique loader identifier.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/Network#type-LoaderId
|
||||
type LoaderID string
|
||||
|
||||
// String returns the LoaderID as string value.
|
||||
func (t LoaderID) String() string {
|
||||
return string(t)
|
||||
}
|
||||
|
||||
// TimeSinceEpoch UTC time in seconds, counted from January 1, 1970.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/Network#type-TimeSinceEpoch
|
||||
type TimeSinceEpoch time.Time
|
||||
|
||||
// Time returns the TimeSinceEpoch as time.Time value.
|
||||
func (t TimeSinceEpoch) Time() time.Time {
|
||||
return time.Time(t)
|
||||
}
|
||||
|
||||
// MarshalEasyJSON satisfies easyjson.Marshaler.
|
||||
func (t TimeSinceEpoch) MarshalEasyJSON(out *jwriter.Writer) {
|
||||
v := float64(time.Time(t).UnixNano() / int64(time.Second))
|
||||
|
||||
out.Buffer.EnsureSpace(20)
|
||||
out.Buffer.Buf = strconv.AppendFloat(out.Buffer.Buf, v, 'f', -1, 64)
|
||||
}
|
||||
|
||||
// MarshalJSON satisfies json.Marshaler.
|
||||
func (t TimeSinceEpoch) MarshalJSON() ([]byte, error) {
|
||||
return easyjson.Marshal(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *TimeSinceEpoch) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
*t = TimeSinceEpoch(time.Unix(0, int64(in.Float64()*float64(time.Second))))
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *TimeSinceEpoch) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// MonotonicTime monotonically increasing time in seconds since an arbitrary
|
||||
// point in the past.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/Network#type-MonotonicTime
|
||||
type MonotonicTime time.Time
|
||||
|
||||
// Time returns the MonotonicTime as time.Time value.
|
||||
func (t MonotonicTime) Time() time.Time {
|
||||
return time.Time(t)
|
||||
}
|
||||
|
||||
// MonotonicTimeEpoch is the MonotonicTime time epoch.
|
||||
var MonotonicTimeEpoch *time.Time
|
||||
|
||||
func init() {
|
||||
// initialize epoch
|
||||
bt := sysutil.BootTime()
|
||||
MonotonicTimeEpoch = &bt
|
||||
}
|
||||
|
||||
// MarshalEasyJSON satisfies easyjson.Marshaler.
|
||||
func (t MonotonicTime) MarshalEasyJSON(out *jwriter.Writer) {
|
||||
v := float64(time.Time(t).Sub(*MonotonicTimeEpoch)) / float64(time.Second)
|
||||
|
||||
out.Buffer.EnsureSpace(20)
|
||||
out.Buffer.Buf = strconv.AppendFloat(out.Buffer.Buf, v, 'f', -1, 64)
|
||||
}
|
||||
|
||||
// MarshalJSON satisfies json.Marshaler.
|
||||
func (t MonotonicTime) MarshalJSON() ([]byte, error) {
|
||||
return easyjson.Marshal(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *MonotonicTime) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
*t = MonotonicTime(MonotonicTimeEpoch.Add(time.Duration(in.Float64() * float64(time.Second))))
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *MonotonicTime) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// FrameID unique frame identifier.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/Page#type-FrameId
|
||||
type FrameID string
|
||||
|
||||
// String returns the FrameID as string value.
|
||||
func (t FrameID) String() string {
|
||||
return string(t)
|
||||
}
|
||||
|
||||
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
|
||||
func (t *FrameID) UnmarshalEasyJSON(in *jlexer.Lexer) {
|
||||
buf := in.Raw()
|
||||
if l := len(buf); l > 2 && buf[0] == '"' && buf[l-1] == '"' {
|
||||
buf = buf[1 : l-1]
|
||||
}
|
||||
|
||||
*t = FrameID(buf)
|
||||
}
|
||||
|
||||
// UnmarshalJSON satisfies json.Unmarshaler.
|
||||
func (t *FrameID) UnmarshalJSON(buf []byte) error {
|
||||
return easyjson.Unmarshal(buf, t)
|
||||
}
|
||||
|
||||
// Frame information about the Frame on the page.
|
||||
//
|
||||
// See: https://chromedevtools.github.io/devtools-protocol/tot/Page#type-Frame
|
||||
type Frame struct {
|
||||
ID FrameID `json:"id"` // Frame unique identifier.
|
||||
ParentID FrameID `json:"parentId,omitempty"` // Parent frame identifier.
|
||||
LoaderID LoaderID `json:"loaderId"` // Identifier of the loader associated with this frame.
|
||||
Name string `json:"name,omitempty"` // Frame's name as specified in the tag.
|
||||
URL string `json:"url"` // Frame document's URL without fragment.
|
||||
URLFragment string `json:"urlFragment,omitempty"` // Frame document's URL fragment including the '#'.
|
||||
SecurityOrigin string `json:"securityOrigin"` // Frame document's security origin.
|
||||
MimeType string `json:"mimeType"` // Frame document's mimeType as determined by the browser.
|
||||
UnreachableURL string `json:"unreachableUrl,omitempty"` // If the frame failed to load, this contains the URL that could not be loaded. Note that unlike url above, this URL may contain a fragment.
|
||||
State FrameState `json:"-"` // Frame state.
|
||||
Root *Node `json:"-"` // Frame document root.
|
||||
Nodes map[NodeID]*Node `json:"-"` // Frame nodes.
|
||||
sync.RWMutex `json:"-"` // Read write mutex.
|
||||
}
|
||||
|
||||
// FrameState is the state of a Frame.
|
||||
type FrameState uint16
|
||||
|
||||
// FrameState enum values.
|
||||
const (
|
||||
FrameDOMContentEventFired FrameState = 1 << (15 - iota)
|
||||
FrameLoadEventFired
|
||||
FrameAttached
|
||||
FrameNavigated
|
||||
FrameLoading
|
||||
FrameScheduledNavigation
|
||||
)
|
||||
|
||||
// frameStateNames are the names of the frame states.
|
||||
var frameStateNames = map[FrameState]string{
|
||||
FrameDOMContentEventFired: "DOMContentEventFired",
|
||||
FrameLoadEventFired: "LoadEventFired",
|
||||
FrameAttached: "Attached",
|
||||
FrameNavigated: "Navigated",
|
||||
FrameLoading: "Loading",
|
||||
FrameScheduledNavigation: "ScheduledNavigation",
|
||||
}
|
||||
|
||||
// String satisfies stringer interface.
|
||||
func (fs FrameState) String() string {
|
||||
var s []string
|
||||
for k, v := range frameStateNames {
|
||||
if fs&k != 0 {
|
||||
s = append(s, v)
|
||||
}
|
||||
}
|
||||
return "[" + strings.Join(s, " ") + "]"
|
||||
}
|
||||
|
||||
// EmptyFrameID is the "non-existent" frame id.
|
||||
const EmptyFrameID = FrameID("")
|
||||
Reference in New Issue
Block a user