// This file is automatically generated by qtc from "extra.qtpl".
// See https://github.com/valyala/quicktemplate for details.

//line templates/extra.qtpl:1
package templates

//line templates/extra.qtpl:1
import (
	qtio422016 "io"

	qt422016 "github.com/valyala/quicktemplate"
)

//line templates/extra.qtpl:1
import (
	"github.com/knq/chromedp/cmd/chromedp-gen/internal"
)

// ExtraTimestampTemplate is a special template for the Timestamp type that
// defines its JSON unmarshaling.

//line templates/extra.qtpl:7
var (
	_ = qtio422016.Copy
	_ = qt422016.AcquireByteBuffer
)

//line templates/extra.qtpl:7
func StreamExtraTimestampTemplate(qw422016 *qt422016.Writer, t *internal.Type, d *internal.Domain) {
	//line templates/extra.qtpl:8
	typ := t.IDorName()

	//line templates/extra.qtpl:9
	qw422016.N().S(`
// MarshalEasyJSON satisfies easyjson.Marshaler.
func (t `)
	//line templates/extra.qtpl:11
	qw422016.N().S(typ)
	//line templates/extra.qtpl:11
	qw422016.N().S(`) MarshalEasyJSON(out *jwriter.Writer) {
	out.Float64(float64(time.Time(t).Sub(sysutil.BootTime()))/float64(time.Second))
}

// MarshalJSON satisfies json.Marshaler.
func (t `)
	//line templates/extra.qtpl:16
	qw422016.N().S(typ)
	//line templates/extra.qtpl:16
	qw422016.N().S(`) MarshalJSON() ([]byte, error) {
	return easyjson.Marshal(t)
}

// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
func (t *`)
	//line templates/extra.qtpl:21
	qw422016.N().S(typ)
	//line templates/extra.qtpl:21
	qw422016.N().S(`) UnmarshalEasyJSON(in *jlexer.Lexer) {
	*t = `)
	//line templates/extra.qtpl:22
	qw422016.N().S(typ)
	//line templates/extra.qtpl:22
	qw422016.N().S(`(sysutil.BootTime().Add(time.Duration(in.Float64()*float64(time.Second))))
}

// UnmarshalJSON satisfies json.Unmarshaler.
func (t *`)
	//line templates/extra.qtpl:26
	qw422016.N().S(typ)
	//line templates/extra.qtpl:26
	qw422016.N().S(`) UnmarshalJSON(buf []byte) error {
	return easyjson.Unmarshal(buf, t)
}
`)
//line templates/extra.qtpl:29
}

//line templates/extra.qtpl:29
func WriteExtraTimestampTemplate(qq422016 qtio422016.Writer, t *internal.Type, d *internal.Domain) {
	//line templates/extra.qtpl:29
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:29
	StreamExtraTimestampTemplate(qw422016, t, d)
	//line templates/extra.qtpl:29
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:29
}

//line templates/extra.qtpl:29
func ExtraTimestampTemplate(t *internal.Type, d *internal.Domain) string {
	//line templates/extra.qtpl:29
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:29
	WriteExtraTimestampTemplate(qb422016, t, d)
	//line templates/extra.qtpl:29
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:29
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:29
	return qs422016
//line templates/extra.qtpl:29
}

// ExtraFrameTemplate is a special template for the Page.Frame type, adding FrameState.

//line templates/extra.qtpl:32
func StreamExtraFrameTemplate(qw422016 *qt422016.Writer) {
	//line templates/extra.qtpl:32
	qw422016.N().S(`
// 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("")
`)
//line templates/extra.qtpl:69
}

//line templates/extra.qtpl:69
func WriteExtraFrameTemplate(qq422016 qtio422016.Writer) {
	//line templates/extra.qtpl:69
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:69
	StreamExtraFrameTemplate(qw422016)
	//line templates/extra.qtpl:69
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:69
}

//line templates/extra.qtpl:69
func ExtraFrameTemplate() string {
	//line templates/extra.qtpl:69
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:69
	WriteExtraFrameTemplate(qb422016)
	//line templates/extra.qtpl:69
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:69
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:69
	return qs422016
//line templates/extra.qtpl:69
}

// ExtraNodeTemplate is a special template for the DOM.Node type, adding NodeState.

//line templates/extra.qtpl:72
func StreamExtraNodeTemplate(qw422016 *qt422016.Writer) {
	//line templates/extra.qtpl:72
	qw422016.N().S(`
// 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 = `)
	//line templates/extra.qtpl:72
	qw422016.N().S("`")
	//line templates/extra.qtpl:72
	qw422016.N().S(`[@id='`)
	//line templates/extra.qtpl:72
	qw422016.N().S("`")
	//line templates/extra.qtpl:72
	qw422016.N().S(`+id+`)
	//line templates/extra.qtpl:72
	qw422016.N().S("`")
	//line templates/extra.qtpl:72
	qw422016.N().S(`']`)
	//line templates/extra.qtpl:72
	qw422016.N().S("`")
	//line templates/extra.qtpl:72
	qw422016.N().S(`

	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)
	}

	return  p + "/" + n.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)
}

// 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)
`)
//line templates/extra.qtpl:186
}

//line templates/extra.qtpl:186
func WriteExtraNodeTemplate(qq422016 qtio422016.Writer) {
	//line templates/extra.qtpl:186
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:186
	StreamExtraNodeTemplate(qw422016)
	//line templates/extra.qtpl:186
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:186
}

//line templates/extra.qtpl:186
func ExtraNodeTemplate() string {
	//line templates/extra.qtpl:186
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:186
	WriteExtraNodeTemplate(qb422016)
	//line templates/extra.qtpl:186
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:186
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:186
	return qs422016
//line templates/extra.qtpl:186
}

// ExtraFixStringUnmarshaler is a template that forces values to be parsed properly.

//line templates/extra.qtpl:189
func StreamExtraFixStringUnmarshaler(qw422016 *qt422016.Writer, typ, parseFunc, extra string) {
	//line templates/extra.qtpl:189
	qw422016.N().S(`
// UnmarshalEasyJSON satisfies easyjson.Unmarshaler.
func (t *`)
	//line templates/extra.qtpl:191
	qw422016.N().S(typ)
	//line templates/extra.qtpl:191
	qw422016.N().S(`) UnmarshalEasyJSON(in *jlexer.Lexer) {
	buf := in.Raw()
	if l := len(buf); l > 2 && buf[0] == '"' && buf[l-1] == '"' {
		buf = buf[1:l-1]
	}
`)
	//line templates/extra.qtpl:196
	if parseFunc != "" {
		//line templates/extra.qtpl:196
		qw422016.N().S(`
	v, err := strconv.`)
		//line templates/extra.qtpl:197
		qw422016.N().S(parseFunc)
		//line templates/extra.qtpl:197
		qw422016.N().S(`(string(buf)`)
		//line templates/extra.qtpl:197
		qw422016.N().S(extra)
		//line templates/extra.qtpl:197
		qw422016.N().S(`)
	if err != nil {
		in.AddError(err)
	}
`)
		//line templates/extra.qtpl:201
	}
	//line templates/extra.qtpl:201
	qw422016.N().S(`
	*t = `)
	//line templates/extra.qtpl:202
	qw422016.N().S(typ)
	//line templates/extra.qtpl:202
	qw422016.N().S(`(`)
	//line templates/extra.qtpl:202
	if parseFunc != "" {
		//line templates/extra.qtpl:202
		qw422016.N().S(`v`)
		//line templates/extra.qtpl:202
	} else {
		//line templates/extra.qtpl:202
		qw422016.N().S(`buf`)
		//line templates/extra.qtpl:202
	}
	//line templates/extra.qtpl:202
	qw422016.N().S(`)
}

// UnmarshalJSON satisfies json.Unmarshaler.
func (t *`)
	//line templates/extra.qtpl:206
	qw422016.N().S(typ)
	//line templates/extra.qtpl:206
	qw422016.N().S(`) UnmarshalJSON(buf []byte) error {
	return easyjson.Unmarshal(buf, t)
}
`)
//line templates/extra.qtpl:209
}

//line templates/extra.qtpl:209
func WriteExtraFixStringUnmarshaler(qq422016 qtio422016.Writer, typ, parseFunc, extra string) {
	//line templates/extra.qtpl:209
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:209
	StreamExtraFixStringUnmarshaler(qw422016, typ, parseFunc, extra)
	//line templates/extra.qtpl:209
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:209
}

//line templates/extra.qtpl:209
func ExtraFixStringUnmarshaler(typ, parseFunc, extra string) string {
	//line templates/extra.qtpl:209
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:209
	WriteExtraFixStringUnmarshaler(qb422016, typ, parseFunc, extra)
	//line templates/extra.qtpl:209
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:209
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:209
	return qs422016
//line templates/extra.qtpl:209
}

// ExtraExceptionDetailsTemplate is a special template for the Runtime.ExceptionDetails type that
// defines the standard error interface.

//line templates/extra.qtpl:213
func StreamExtraExceptionDetailsTemplate(qw422016 *qt422016.Writer) {
	//line templates/extra.qtpl:213
	qw422016.N().S(`
// Error satisfies the error interface.
func (e *ExceptionDetails) Error() string {
	// TODO: watch script parsed events and match the ExceptionDetails.ScriptID
	// to the name/location of the actual code and display here
	return fmt.Sprintf("encountered exception '%s' (%d:%d)", e.Text, e.LineNumber, e.ColumnNumber)
}
`)
//line templates/extra.qtpl:220
}

//line templates/extra.qtpl:220
func WriteExtraExceptionDetailsTemplate(qq422016 qtio422016.Writer) {
	//line templates/extra.qtpl:220
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:220
	StreamExtraExceptionDetailsTemplate(qw422016)
	//line templates/extra.qtpl:220
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:220
}

//line templates/extra.qtpl:220
func ExtraExceptionDetailsTemplate() string {
	//line templates/extra.qtpl:220
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:220
	WriteExtraExceptionDetailsTemplate(qb422016)
	//line templates/extra.qtpl:220
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:220
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:220
	return qs422016
//line templates/extra.qtpl:220
}

// ExtraCDPTypes is the template for additional internal type
// declarations.

//line templates/extra.qtpl:224
func StreamExtraCDPTypes(qw422016 *qt422016.Writer) {
	//line templates/extra.qtpl:224
	qw422016.N().S(`

// Error satisfies the error interface.
func (t ErrorType) Error() string {
	return string(t)
}

// Handler is the common interface for a Chrome Debugging Protocol target.
type Handler interface {
	// SetActive changes the top level frame id.
	SetActive(context.Context, FrameID) error

	// GetRoot returns the root document node for the top level frame.
	GetRoot(context.Context) (*Node, error)

	// WaitFrame waits for a frame to be available.
	WaitFrame(context.Context, FrameID) (*Frame, error)

	// WaitNode waits for a node to be available.
	WaitNode(context.Context, *Frame, NodeID) (*Node, error)

	// Execute executes the specified command using the supplied context and
	// parameters.
	Execute(context.Context, MethodType, easyjson.Marshaler, easyjson.Unmarshaler) error

	// Listen creates a channel that will receive an event for the types
	// specified.
	Listen(...MethodType) <-chan interface{}

	// Release releases a channel returned from Listen.
	Release(<-chan interface{})
}
`)
//line templates/extra.qtpl:256
}

//line templates/extra.qtpl:256
func WriteExtraCDPTypes(qq422016 qtio422016.Writer) {
	//line templates/extra.qtpl:256
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:256
	StreamExtraCDPTypes(qw422016)
	//line templates/extra.qtpl:256
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:256
}

//line templates/extra.qtpl:256
func ExtraCDPTypes() string {
	//line templates/extra.qtpl:256
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:256
	WriteExtraCDPTypes(qb422016)
	//line templates/extra.qtpl:256
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:256
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:256
	return qs422016
//line templates/extra.qtpl:256
}

// ExtraUtilTemplate generates the decode func for the Message type.

//line templates/extra.qtpl:259
func StreamExtraUtilTemplate(qw422016 *qt422016.Writer, domains []*internal.Domain) {
	//line templates/extra.qtpl:259
	qw422016.N().S(`
type empty struct{}
var emptyVal = &empty{}

// UnmarshalMessage unmarshals the message result or params.
func UnmarshalMessage(msg *cdp.Message) (interface{}, error) {
	var v easyjson.Unmarshaler
	switch msg.Method {`)
	//line templates/extra.qtpl:266
	for _, d := range domains {
		//line templates/extra.qtpl:266
		for _, c := range d.Commands {
			//line templates/extra.qtpl:266
			qw422016.N().S(`
	case cdp.`)
			//line templates/extra.qtpl:267
			qw422016.N().S(c.CommandMethodType(d))
			//line templates/extra.qtpl:267
			qw422016.N().S(`:`)
			//line templates/extra.qtpl:267
			if len(c.Returns) == 0 {
				//line templates/extra.qtpl:267
				qw422016.N().S(`
		return emptyVal, nil`)
				//line templates/extra.qtpl:268
			} else {
				//line templates/extra.qtpl:268
				qw422016.N().S(`
		v = new(`)
				//line templates/extra.qtpl:269
				qw422016.N().S(d.PackageRefName())
				//line templates/extra.qtpl:269
				qw422016.N().S(`.`)
				//line templates/extra.qtpl:269
				qw422016.N().S(c.CommandReturnsType())
				//line templates/extra.qtpl:269
				qw422016.N().S(`)`)
				//line templates/extra.qtpl:269
			}
			//line templates/extra.qtpl:269
			qw422016.N().S(`
	`)
			//line templates/extra.qtpl:270
		}
		//line templates/extra.qtpl:270
		for _, e := range d.Events {
			//line templates/extra.qtpl:270
			qw422016.N().S(`
	case cdp.`)
			//line templates/extra.qtpl:271
			qw422016.N().S(e.EventMethodType(d))
			//line templates/extra.qtpl:271
			qw422016.N().S(`:
		v = new(`)
			//line templates/extra.qtpl:272
			qw422016.N().S(d.PackageRefName())
			//line templates/extra.qtpl:272
			qw422016.N().S(`.`)
			//line templates/extra.qtpl:272
			qw422016.N().S(e.EventType())
			//line templates/extra.qtpl:272
			qw422016.N().S(`)
	`)
			//line templates/extra.qtpl:273
		}
		//line templates/extra.qtpl:273
	}
	//line templates/extra.qtpl:273
	qw422016.N().S(`}

	var buf easyjson.RawMessage
	switch {
	case msg.Params != nil:
		buf = msg.Params

	case msg.Result != nil:
		buf = msg.Result

	default:
		return nil, errors.New("msg missing params or result")
	}

	err := easyjson.Unmarshal(buf, v)
	if err != nil {
		return nil, err
	}

	return v, nil
}
`)
//line templates/extra.qtpl:294
}

//line templates/extra.qtpl:294
func WriteExtraUtilTemplate(qq422016 qtio422016.Writer, domains []*internal.Domain) {
	//line templates/extra.qtpl:294
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:294
	StreamExtraUtilTemplate(qw422016, domains)
	//line templates/extra.qtpl:294
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:294
}

//line templates/extra.qtpl:294
func ExtraUtilTemplate(domains []*internal.Domain) string {
	//line templates/extra.qtpl:294
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:294
	WriteExtraUtilTemplate(qb422016, domains)
	//line templates/extra.qtpl:294
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:294
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:294
	return qs422016
//line templates/extra.qtpl:294
}

//line templates/extra.qtpl:296
func StreamExtraMethodTypeDomainDecoder(qw422016 *qt422016.Writer) {
	//line templates/extra.qtpl:296
	qw422016.N().S(`
// Domain returns the Chrome Debugging Protocol domain of the event or command.
func (t MethodType) Domain() string {
	return string(t[:strings.IndexByte(string(t), '.')])
}
`)
//line templates/extra.qtpl:301
}

//line templates/extra.qtpl:301
func WriteExtraMethodTypeDomainDecoder(qq422016 qtio422016.Writer) {
	//line templates/extra.qtpl:301
	qw422016 := qt422016.AcquireWriter(qq422016)
	//line templates/extra.qtpl:301
	StreamExtraMethodTypeDomainDecoder(qw422016)
	//line templates/extra.qtpl:301
	qt422016.ReleaseWriter(qw422016)
//line templates/extra.qtpl:301
}

//line templates/extra.qtpl:301
func ExtraMethodTypeDomainDecoder() string {
	//line templates/extra.qtpl:301
	qb422016 := qt422016.AcquireByteBuffer()
	//line templates/extra.qtpl:301
	WriteExtraMethodTypeDomainDecoder(qb422016)
	//line templates/extra.qtpl:301
	qs422016 := string(qb422016.B)
	//line templates/extra.qtpl:301
	qt422016.ReleaseByteBuffer(qb422016)
	//line templates/extra.qtpl:301
	return qs422016
//line templates/extra.qtpl:301
}