mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Update x/net (#5169)
This commit is contained in:
		
				
					committed by
					
						
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							f887085ee0
						
					
				
				
					commit
					2af57c7820
				
			
							
								
								
									
										5
									
								
								Gopkg.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5
									
								
								Gopkg.lock
									
									
									
										generated
									
									
									
								
							@@ -746,7 +746,8 @@
 | 
			
		||||
  revision = "12dd70caea0268ac0d6c2707d0611ef601e7c64e"
 | 
			
		||||
 | 
			
		||||
[[projects]]
 | 
			
		||||
  digest = "1:47ea747d07fae720d749d06ac5dc5ded0df70c57e328b6549cf2d9c64698757e"
 | 
			
		||||
  branch = "master"
 | 
			
		||||
  digest = "1:6d5ed712653ea5321fe3e3475ab2188cf362a4e0d31e9fd3acbd4dfbbca0d680"
 | 
			
		||||
  name = "golang.org/x/net"
 | 
			
		||||
  packages = [
 | 
			
		||||
    "context",
 | 
			
		||||
@@ -755,7 +756,7 @@
 | 
			
		||||
    "html/charset",
 | 
			
		||||
  ]
 | 
			
		||||
  pruneopts = "NUT"
 | 
			
		||||
  revision = "f2499483f923065a842d38eb4c7f1927e6fc6e6d"
 | 
			
		||||
  revision = "9b4f9f5ad5197c79fd623a3638e70d8b26cef344"
 | 
			
		||||
 | 
			
		||||
[[projects]]
 | 
			
		||||
  digest = "1:8159a9cda4b8810aaaeb0d60e2fa68e2fd86d8af4ec8f5059830839e3c8d93d5"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ ignored = ["google.golang.org/appengine*"]
 | 
			
		||||
  name = "golang.org/x/text"
 | 
			
		||||
 | 
			
		||||
[[constraint]]
 | 
			
		||||
  revision = "f2499483f923065a842d38eb4c7f1927e6fc6e6d"
 | 
			
		||||
  branch = "master"
 | 
			
		||||
  name = "golang.org/x/net"
 | 
			
		||||
 | 
			
		||||
[[override]]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										104
									
								
								vendor/golang.org/x/net/context/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										104
									
								
								vendor/golang.org/x/net/context/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,6 +5,8 @@
 | 
			
		||||
// Package context defines the Context type, which carries deadlines,
 | 
			
		||||
// cancelation signals, and other request-scoped values across API boundaries
 | 
			
		||||
// and between processes.
 | 
			
		||||
// As of Go 1.7 this package is available in the standard library under the
 | 
			
		||||
// name context.  https://golang.org/pkg/context.
 | 
			
		||||
//
 | 
			
		||||
// Incoming requests to a server should create a Context, and outgoing calls to
 | 
			
		||||
// servers should accept a Context. The chain of function calls between must
 | 
			
		||||
@@ -36,103 +38,6 @@
 | 
			
		||||
// Contexts.
 | 
			
		||||
package context // import "golang.org/x/net/context"
 | 
			
		||||
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
// A Context carries a deadline, a cancelation signal, and other values across
 | 
			
		||||
// API boundaries.
 | 
			
		||||
//
 | 
			
		||||
// Context's methods may be called by multiple goroutines simultaneously.
 | 
			
		||||
type Context interface {
 | 
			
		||||
	// Deadline returns the time when work done on behalf of this context
 | 
			
		||||
	// should be canceled.  Deadline returns ok==false when no deadline is
 | 
			
		||||
	// set.  Successive calls to Deadline return the same results.
 | 
			
		||||
	Deadline() (deadline time.Time, ok bool)
 | 
			
		||||
 | 
			
		||||
	// Done returns a channel that's closed when work done on behalf of this
 | 
			
		||||
	// context should be canceled.  Done may return nil if this context can
 | 
			
		||||
	// never be canceled.  Successive calls to Done return the same value.
 | 
			
		||||
	//
 | 
			
		||||
	// WithCancel arranges for Done to be closed when cancel is called;
 | 
			
		||||
	// WithDeadline arranges for Done to be closed when the deadline
 | 
			
		||||
	// expires; WithTimeout arranges for Done to be closed when the timeout
 | 
			
		||||
	// elapses.
 | 
			
		||||
	//
 | 
			
		||||
	// Done is provided for use in select statements:
 | 
			
		||||
	//
 | 
			
		||||
	//  // Stream generates values with DoSomething and sends them to out
 | 
			
		||||
	//  // until DoSomething returns an error or ctx.Done is closed.
 | 
			
		||||
	//  func Stream(ctx context.Context, out chan<- Value) error {
 | 
			
		||||
	//  	for {
 | 
			
		||||
	//  		v, err := DoSomething(ctx)
 | 
			
		||||
	//  		if err != nil {
 | 
			
		||||
	//  			return err
 | 
			
		||||
	//  		}
 | 
			
		||||
	//  		select {
 | 
			
		||||
	//  		case <-ctx.Done():
 | 
			
		||||
	//  			return ctx.Err()
 | 
			
		||||
	//  		case out <- v:
 | 
			
		||||
	//  		}
 | 
			
		||||
	//  	}
 | 
			
		||||
	//  }
 | 
			
		||||
	//
 | 
			
		||||
	// See http://blog.golang.org/pipelines for more examples of how to use
 | 
			
		||||
	// a Done channel for cancelation.
 | 
			
		||||
	Done() <-chan struct{}
 | 
			
		||||
 | 
			
		||||
	// Err returns a non-nil error value after Done is closed.  Err returns
 | 
			
		||||
	// Canceled if the context was canceled or DeadlineExceeded if the
 | 
			
		||||
	// context's deadline passed.  No other values for Err are defined.
 | 
			
		||||
	// After Done is closed, successive calls to Err return the same value.
 | 
			
		||||
	Err() error
 | 
			
		||||
 | 
			
		||||
	// Value returns the value associated with this context for key, or nil
 | 
			
		||||
	// if no value is associated with key.  Successive calls to Value with
 | 
			
		||||
	// the same key returns the same result.
 | 
			
		||||
	//
 | 
			
		||||
	// Use context values only for request-scoped data that transits
 | 
			
		||||
	// processes and API boundaries, not for passing optional parameters to
 | 
			
		||||
	// functions.
 | 
			
		||||
	//
 | 
			
		||||
	// A key identifies a specific value in a Context.  Functions that wish
 | 
			
		||||
	// to store values in Context typically allocate a key in a global
 | 
			
		||||
	// variable then use that key as the argument to context.WithValue and
 | 
			
		||||
	// Context.Value.  A key can be any type that supports equality;
 | 
			
		||||
	// packages should define keys as an unexported type to avoid
 | 
			
		||||
	// collisions.
 | 
			
		||||
	//
 | 
			
		||||
	// Packages that define a Context key should provide type-safe accessors
 | 
			
		||||
	// for the values stores using that key:
 | 
			
		||||
	//
 | 
			
		||||
	// 	// Package user defines a User type that's stored in Contexts.
 | 
			
		||||
	// 	package user
 | 
			
		||||
	//
 | 
			
		||||
	// 	import "golang.org/x/net/context"
 | 
			
		||||
	//
 | 
			
		||||
	// 	// User is the type of value stored in the Contexts.
 | 
			
		||||
	// 	type User struct {...}
 | 
			
		||||
	//
 | 
			
		||||
	// 	// key is an unexported type for keys defined in this package.
 | 
			
		||||
	// 	// This prevents collisions with keys defined in other packages.
 | 
			
		||||
	// 	type key int
 | 
			
		||||
	//
 | 
			
		||||
	// 	// userKey is the key for user.User values in Contexts.  It is
 | 
			
		||||
	// 	// unexported; clients use user.NewContext and user.FromContext
 | 
			
		||||
	// 	// instead of using this key directly.
 | 
			
		||||
	// 	var userKey key = 0
 | 
			
		||||
	//
 | 
			
		||||
	// 	// NewContext returns a new Context that carries value u.
 | 
			
		||||
	// 	func NewContext(ctx context.Context, u *User) context.Context {
 | 
			
		||||
	// 		return context.WithValue(ctx, userKey, u)
 | 
			
		||||
	// 	}
 | 
			
		||||
	//
 | 
			
		||||
	// 	// FromContext returns the User value stored in ctx, if any.
 | 
			
		||||
	// 	func FromContext(ctx context.Context) (*User, bool) {
 | 
			
		||||
	// 		u, ok := ctx.Value(userKey).(*User)
 | 
			
		||||
	// 		return u, ok
 | 
			
		||||
	// 	}
 | 
			
		||||
	Value(key interface{}) interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Background returns a non-nil, empty Context. It is never canceled, has no
 | 
			
		||||
// values, and has no deadline. It is typically used by the main function,
 | 
			
		||||
// initialization, and tests, and as the top-level Context for incoming
 | 
			
		||||
@@ -149,8 +54,3 @@ func Background() Context {
 | 
			
		||||
func TODO() Context {
 | 
			
		||||
	return todo
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A CancelFunc tells an operation to abandon its work.
 | 
			
		||||
// A CancelFunc does not wait for the work to stop.
 | 
			
		||||
// After the first call, subsequent calls to a CancelFunc do nothing.
 | 
			
		||||
type CancelFunc func()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/net/context/go19.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/net/context/go19.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
// Copyright 2017 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build go1.9
 | 
			
		||||
 | 
			
		||||
package context
 | 
			
		||||
 | 
			
		||||
import "context" // standard library's context, as of Go 1.7
 | 
			
		||||
 | 
			
		||||
// A Context carries a deadline, a cancelation signal, and other values across
 | 
			
		||||
// API boundaries.
 | 
			
		||||
//
 | 
			
		||||
// Context's methods may be called by multiple goroutines simultaneously.
 | 
			
		||||
type Context = context.Context
 | 
			
		||||
 | 
			
		||||
// A CancelFunc tells an operation to abandon its work.
 | 
			
		||||
// A CancelFunc does not wait for the work to stop.
 | 
			
		||||
// After the first call, subsequent calls to a CancelFunc do nothing.
 | 
			
		||||
type CancelFunc = context.CancelFunc
 | 
			
		||||
							
								
								
									
										109
									
								
								vendor/golang.org/x/net/context/pre_go19.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								vendor/golang.org/x/net/context/pre_go19.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,109 @@
 | 
			
		||||
// Copyright 2014 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !go1.9
 | 
			
		||||
 | 
			
		||||
package context
 | 
			
		||||
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
// A Context carries a deadline, a cancelation signal, and other values across
 | 
			
		||||
// API boundaries.
 | 
			
		||||
//
 | 
			
		||||
// Context's methods may be called by multiple goroutines simultaneously.
 | 
			
		||||
type Context interface {
 | 
			
		||||
	// Deadline returns the time when work done on behalf of this context
 | 
			
		||||
	// should be canceled. Deadline returns ok==false when no deadline is
 | 
			
		||||
	// set. Successive calls to Deadline return the same results.
 | 
			
		||||
	Deadline() (deadline time.Time, ok bool)
 | 
			
		||||
 | 
			
		||||
	// Done returns a channel that's closed when work done on behalf of this
 | 
			
		||||
	// context should be canceled. Done may return nil if this context can
 | 
			
		||||
	// never be canceled. Successive calls to Done return the same value.
 | 
			
		||||
	//
 | 
			
		||||
	// WithCancel arranges for Done to be closed when cancel is called;
 | 
			
		||||
	// WithDeadline arranges for Done to be closed when the deadline
 | 
			
		||||
	// expires; WithTimeout arranges for Done to be closed when the timeout
 | 
			
		||||
	// elapses.
 | 
			
		||||
	//
 | 
			
		||||
	// Done is provided for use in select statements:
 | 
			
		||||
	//
 | 
			
		||||
	//  // Stream generates values with DoSomething and sends them to out
 | 
			
		||||
	//  // until DoSomething returns an error or ctx.Done is closed.
 | 
			
		||||
	//  func Stream(ctx context.Context, out chan<- Value) error {
 | 
			
		||||
	//  	for {
 | 
			
		||||
	//  		v, err := DoSomething(ctx)
 | 
			
		||||
	//  		if err != nil {
 | 
			
		||||
	//  			return err
 | 
			
		||||
	//  		}
 | 
			
		||||
	//  		select {
 | 
			
		||||
	//  		case <-ctx.Done():
 | 
			
		||||
	//  			return ctx.Err()
 | 
			
		||||
	//  		case out <- v:
 | 
			
		||||
	//  		}
 | 
			
		||||
	//  	}
 | 
			
		||||
	//  }
 | 
			
		||||
	//
 | 
			
		||||
	// See http://blog.golang.org/pipelines for more examples of how to use
 | 
			
		||||
	// a Done channel for cancelation.
 | 
			
		||||
	Done() <-chan struct{}
 | 
			
		||||
 | 
			
		||||
	// Err returns a non-nil error value after Done is closed. Err returns
 | 
			
		||||
	// Canceled if the context was canceled or DeadlineExceeded if the
 | 
			
		||||
	// context's deadline passed. No other values for Err are defined.
 | 
			
		||||
	// After Done is closed, successive calls to Err return the same value.
 | 
			
		||||
	Err() error
 | 
			
		||||
 | 
			
		||||
	// Value returns the value associated with this context for key, or nil
 | 
			
		||||
	// if no value is associated with key. Successive calls to Value with
 | 
			
		||||
	// the same key returns the same result.
 | 
			
		||||
	//
 | 
			
		||||
	// Use context values only for request-scoped data that transits
 | 
			
		||||
	// processes and API boundaries, not for passing optional parameters to
 | 
			
		||||
	// functions.
 | 
			
		||||
	//
 | 
			
		||||
	// A key identifies a specific value in a Context. Functions that wish
 | 
			
		||||
	// to store values in Context typically allocate a key in a global
 | 
			
		||||
	// variable then use that key as the argument to context.WithValue and
 | 
			
		||||
	// Context.Value. A key can be any type that supports equality;
 | 
			
		||||
	// packages should define keys as an unexported type to avoid
 | 
			
		||||
	// collisions.
 | 
			
		||||
	//
 | 
			
		||||
	// Packages that define a Context key should provide type-safe accessors
 | 
			
		||||
	// for the values stores using that key:
 | 
			
		||||
	//
 | 
			
		||||
	// 	// Package user defines a User type that's stored in Contexts.
 | 
			
		||||
	// 	package user
 | 
			
		||||
	//
 | 
			
		||||
	// 	import "golang.org/x/net/context"
 | 
			
		||||
	//
 | 
			
		||||
	// 	// User is the type of value stored in the Contexts.
 | 
			
		||||
	// 	type User struct {...}
 | 
			
		||||
	//
 | 
			
		||||
	// 	// key is an unexported type for keys defined in this package.
 | 
			
		||||
	// 	// This prevents collisions with keys defined in other packages.
 | 
			
		||||
	// 	type key int
 | 
			
		||||
	//
 | 
			
		||||
	// 	// userKey is the key for user.User values in Contexts. It is
 | 
			
		||||
	// 	// unexported; clients use user.NewContext and user.FromContext
 | 
			
		||||
	// 	// instead of using this key directly.
 | 
			
		||||
	// 	var userKey key = 0
 | 
			
		||||
	//
 | 
			
		||||
	// 	// NewContext returns a new Context that carries value u.
 | 
			
		||||
	// 	func NewContext(ctx context.Context, u *User) context.Context {
 | 
			
		||||
	// 		return context.WithValue(ctx, userKey, u)
 | 
			
		||||
	// 	}
 | 
			
		||||
	//
 | 
			
		||||
	// 	// FromContext returns the User value stored in ctx, if any.
 | 
			
		||||
	// 	func FromContext(ctx context.Context) (*User, bool) {
 | 
			
		||||
	// 		u, ok := ctx.Value(userKey).(*User)
 | 
			
		||||
	// 		return u, ok
 | 
			
		||||
	// 	}
 | 
			
		||||
	Value(key interface{}) interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A CancelFunc tells an operation to abandon its work.
 | 
			
		||||
// A CancelFunc does not wait for the work to stop.
 | 
			
		||||
// After the first call, subsequent calls to a CancelFunc do nothing.
 | 
			
		||||
type CancelFunc func()
 | 
			
		||||
							
								
								
									
										138
									
								
								vendor/golang.org/x/net/html/atom/gen.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										138
									
								
								vendor/golang.org/x/net/html/atom/gen.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,17 +4,17 @@
 | 
			
		||||
 | 
			
		||||
// +build ignore
 | 
			
		||||
 | 
			
		||||
//go:generate go run gen.go
 | 
			
		||||
//go:generate go run gen.go -test
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
// This program generates table.go and table_test.go.
 | 
			
		||||
// Invoke as
 | 
			
		||||
//
 | 
			
		||||
//	go run gen.go |gofmt >table.go
 | 
			
		||||
//	go run gen.go -test |gofmt >table_test.go
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"go/format"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sort"
 | 
			
		||||
@@ -42,6 +42,18 @@ func identifier(s string) string {
 | 
			
		||||
 | 
			
		||||
var test = flag.Bool("test", false, "generate table_test.go")
 | 
			
		||||
 | 
			
		||||
func genFile(name string, buf *bytes.Buffer) {
 | 
			
		||||
	b, err := format.Source(buf.Bytes())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintln(os.Stderr, err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
	if err := ioutil.WriteFile(name, b, 0644); err != nil {
 | 
			
		||||
		fmt.Fprintln(os.Stderr, err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
@@ -52,32 +64,31 @@ func main() {
 | 
			
		||||
	all = append(all, extra...)
 | 
			
		||||
	sort.Strings(all)
 | 
			
		||||
 | 
			
		||||
	if *test {
 | 
			
		||||
		fmt.Printf("// generated by go run gen.go -test; DO NOT EDIT\n\n")
 | 
			
		||||
		fmt.Printf("package atom\n\n")
 | 
			
		||||
		fmt.Printf("var testAtomList = []string{\n")
 | 
			
		||||
		for _, s := range all {
 | 
			
		||||
			fmt.Printf("\t%q,\n", s)
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Printf("}\n")
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// uniq - lists have dups
 | 
			
		||||
	// compute max len too
 | 
			
		||||
	maxLen := 0
 | 
			
		||||
	w := 0
 | 
			
		||||
	for _, s := range all {
 | 
			
		||||
		if w == 0 || all[w-1] != s {
 | 
			
		||||
			if maxLen < len(s) {
 | 
			
		||||
				maxLen = len(s)
 | 
			
		||||
			}
 | 
			
		||||
			all[w] = s
 | 
			
		||||
			w++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	all = all[:w]
 | 
			
		||||
 | 
			
		||||
	if *test {
 | 
			
		||||
		var buf bytes.Buffer
 | 
			
		||||
		fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n")
 | 
			
		||||
		fmt.Fprintln(&buf, "//go:generate go run gen.go -test\n")
 | 
			
		||||
		fmt.Fprintln(&buf, "package atom\n")
 | 
			
		||||
		fmt.Fprintln(&buf, "var testAtomList = []string{")
 | 
			
		||||
		for _, s := range all {
 | 
			
		||||
			fmt.Fprintf(&buf, "\t%q,\n", s)
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Fprintln(&buf, "}")
 | 
			
		||||
 | 
			
		||||
		genFile("table_test.go", &buf)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Find hash that minimizes table size.
 | 
			
		||||
	var best *table
 | 
			
		||||
	for i := 0; i < 1000000; i++ {
 | 
			
		||||
@@ -163,36 +174,46 @@ func main() {
 | 
			
		||||
		atom[s] = uint32(off<<8 | len(s))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var buf bytes.Buffer
 | 
			
		||||
	// Generate the Go code.
 | 
			
		||||
	fmt.Printf("// generated by go run gen.go; DO NOT EDIT\n\n")
 | 
			
		||||
	fmt.Printf("package atom\n\nconst (\n")
 | 
			
		||||
	fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n")
 | 
			
		||||
	fmt.Fprintln(&buf, "//go:generate go run gen.go\n")
 | 
			
		||||
	fmt.Fprintln(&buf, "package atom\n\nconst (")
 | 
			
		||||
 | 
			
		||||
	// compute max len
 | 
			
		||||
	maxLen := 0
 | 
			
		||||
	for _, s := range all {
 | 
			
		||||
		fmt.Printf("\t%s Atom = %#x\n", identifier(s), atom[s])
 | 
			
		||||
		if maxLen < len(s) {
 | 
			
		||||
			maxLen = len(s)
 | 
			
		||||
		}
 | 
			
		||||
	fmt.Printf(")\n\n")
 | 
			
		||||
		fmt.Fprintf(&buf, "\t%s Atom = %#x\n", identifier(s), atom[s])
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Fprintln(&buf, ")\n")
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("const hash0 = %#x\n\n", best.h0)
 | 
			
		||||
	fmt.Printf("const maxAtomLen = %d\n\n", maxLen)
 | 
			
		||||
	fmt.Fprintf(&buf, "const hash0 = %#x\n\n", best.h0)
 | 
			
		||||
	fmt.Fprintf(&buf, "const maxAtomLen = %d\n\n", maxLen)
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("var table = [1<<%d]Atom{\n", best.k)
 | 
			
		||||
	fmt.Fprintf(&buf, "var table = [1<<%d]Atom{\n", best.k)
 | 
			
		||||
	for i, s := range best.tab {
 | 
			
		||||
		if s == "" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Printf("\t%#x: %#x, // %s\n", i, atom[s], s)
 | 
			
		||||
		fmt.Fprintf(&buf, "\t%#x: %#x, // %s\n", i, atom[s], s)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Printf("}\n")
 | 
			
		||||
	fmt.Fprintf(&buf, "}\n")
 | 
			
		||||
	datasize := (1 << best.k) * 4
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("const atomText =\n")
 | 
			
		||||
	fmt.Fprintln(&buf, "const atomText =")
 | 
			
		||||
	textsize := len(text)
 | 
			
		||||
	for len(text) > 60 {
 | 
			
		||||
		fmt.Printf("\t%q +\n", text[:60])
 | 
			
		||||
		fmt.Fprintf(&buf, "\t%q +\n", text[:60])
 | 
			
		||||
		text = text[60:]
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Printf("\t%q\n\n", text)
 | 
			
		||||
	fmt.Fprintf(&buf, "\t%q\n\n", text)
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize)
 | 
			
		||||
	genFile("table.go", &buf)
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(os.Stdout, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type byLen []string
 | 
			
		||||
@@ -285,8 +306,10 @@ func (t *table) push(i uint32, depth int) bool {
 | 
			
		||||
 | 
			
		||||
// The lists of element names and attribute keys were taken from
 | 
			
		||||
// https://html.spec.whatwg.org/multipage/indices.html#index
 | 
			
		||||
// as of the "HTML Living Standard - Last Updated 21 February 2015" version.
 | 
			
		||||
// as of the "HTML Living Standard - Last Updated 16 April 2018" version.
 | 
			
		||||
 | 
			
		||||
// "command", "keygen" and "menuitem" have been removed from the spec,
 | 
			
		||||
// but are kept here for backwards compatibility.
 | 
			
		||||
var elements = []string{
 | 
			
		||||
	"a",
 | 
			
		||||
	"abbr",
 | 
			
		||||
@@ -349,6 +372,7 @@ var elements = []string{
 | 
			
		||||
	"legend",
 | 
			
		||||
	"li",
 | 
			
		||||
	"link",
 | 
			
		||||
	"main",
 | 
			
		||||
	"map",
 | 
			
		||||
	"mark",
 | 
			
		||||
	"menu",
 | 
			
		||||
@@ -364,6 +388,7 @@ var elements = []string{
 | 
			
		||||
	"output",
 | 
			
		||||
	"p",
 | 
			
		||||
	"param",
 | 
			
		||||
	"picture",
 | 
			
		||||
	"pre",
 | 
			
		||||
	"progress",
 | 
			
		||||
	"q",
 | 
			
		||||
@@ -375,6 +400,7 @@ var elements = []string{
 | 
			
		||||
	"script",
 | 
			
		||||
	"section",
 | 
			
		||||
	"select",
 | 
			
		||||
	"slot",
 | 
			
		||||
	"small",
 | 
			
		||||
	"source",
 | 
			
		||||
	"span",
 | 
			
		||||
@@ -403,14 +429,21 @@ var elements = []string{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// https://html.spec.whatwg.org/multipage/indices.html#attributes-3
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup",
 | 
			
		||||
// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec,
 | 
			
		||||
// but are kept here for backwards compatibility.
 | 
			
		||||
var attributes = []string{
 | 
			
		||||
	"abbr",
 | 
			
		||||
	"accept",
 | 
			
		||||
	"accept-charset",
 | 
			
		||||
	"accesskey",
 | 
			
		||||
	"action",
 | 
			
		||||
	"allowfullscreen",
 | 
			
		||||
	"allowpaymentrequest",
 | 
			
		||||
	"allowusermedia",
 | 
			
		||||
	"alt",
 | 
			
		||||
	"as",
 | 
			
		||||
	"async",
 | 
			
		||||
	"autocomplete",
 | 
			
		||||
	"autofocus",
 | 
			
		||||
@@ -420,6 +453,7 @@ var attributes = []string{
 | 
			
		||||
	"checked",
 | 
			
		||||
	"cite",
 | 
			
		||||
	"class",
 | 
			
		||||
	"color",
 | 
			
		||||
	"cols",
 | 
			
		||||
	"colspan",
 | 
			
		||||
	"command",
 | 
			
		||||
@@ -457,6 +491,8 @@ var attributes = []string{
 | 
			
		||||
	"icon",
 | 
			
		||||
	"id",
 | 
			
		||||
	"inputmode",
 | 
			
		||||
	"integrity",
 | 
			
		||||
	"is",
 | 
			
		||||
	"ismap",
 | 
			
		||||
	"itemid",
 | 
			
		||||
	"itemprop",
 | 
			
		||||
@@ -481,16 +517,20 @@ var attributes = []string{
 | 
			
		||||
	"multiple",
 | 
			
		||||
	"muted",
 | 
			
		||||
	"name",
 | 
			
		||||
	"nomodule",
 | 
			
		||||
	"nonce",
 | 
			
		||||
	"novalidate",
 | 
			
		||||
	"open",
 | 
			
		||||
	"optimum",
 | 
			
		||||
	"pattern",
 | 
			
		||||
	"ping",
 | 
			
		||||
	"placeholder",
 | 
			
		||||
	"playsinline",
 | 
			
		||||
	"poster",
 | 
			
		||||
	"preload",
 | 
			
		||||
	"radiogroup",
 | 
			
		||||
	"readonly",
 | 
			
		||||
	"referrerpolicy",
 | 
			
		||||
	"rel",
 | 
			
		||||
	"required",
 | 
			
		||||
	"reversed",
 | 
			
		||||
@@ -507,10 +547,13 @@ var attributes = []string{
 | 
			
		||||
	"sizes",
 | 
			
		||||
	"sortable",
 | 
			
		||||
	"sorted",
 | 
			
		||||
	"slot",
 | 
			
		||||
	"span",
 | 
			
		||||
	"spellcheck",
 | 
			
		||||
	"src",
 | 
			
		||||
	"srcdoc",
 | 
			
		||||
	"srclang",
 | 
			
		||||
	"srcset",
 | 
			
		||||
	"start",
 | 
			
		||||
	"step",
 | 
			
		||||
	"style",
 | 
			
		||||
@@ -520,16 +563,22 @@ var attributes = []string{
 | 
			
		||||
	"translate",
 | 
			
		||||
	"type",
 | 
			
		||||
	"typemustmatch",
 | 
			
		||||
	"updateviacache",
 | 
			
		||||
	"usemap",
 | 
			
		||||
	"value",
 | 
			
		||||
	"width",
 | 
			
		||||
	"workertype",
 | 
			
		||||
	"wrap",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// "onautocomplete", "onautocompleteerror", "onmousewheel",
 | 
			
		||||
// "onshow" and "onsort" have been removed from the spec,
 | 
			
		||||
// but are kept here for backwards compatibility.
 | 
			
		||||
var eventHandlers = []string{
 | 
			
		||||
	"onabort",
 | 
			
		||||
	"onautocomplete",
 | 
			
		||||
	"onautocompleteerror",
 | 
			
		||||
	"onauxclick",
 | 
			
		||||
	"onafterprint",
 | 
			
		||||
	"onbeforeprint",
 | 
			
		||||
	"onbeforeunload",
 | 
			
		||||
@@ -541,11 +590,14 @@ var eventHandlers = []string{
 | 
			
		||||
	"onclick",
 | 
			
		||||
	"onclose",
 | 
			
		||||
	"oncontextmenu",
 | 
			
		||||
	"oncopy",
 | 
			
		||||
	"oncuechange",
 | 
			
		||||
	"oncut",
 | 
			
		||||
	"ondblclick",
 | 
			
		||||
	"ondrag",
 | 
			
		||||
	"ondragend",
 | 
			
		||||
	"ondragenter",
 | 
			
		||||
	"ondragexit",
 | 
			
		||||
	"ondragleave",
 | 
			
		||||
	"ondragover",
 | 
			
		||||
	"ondragstart",
 | 
			
		||||
@@ -565,18 +617,24 @@ var eventHandlers = []string{
 | 
			
		||||
	"onload",
 | 
			
		||||
	"onloadeddata",
 | 
			
		||||
	"onloadedmetadata",
 | 
			
		||||
	"onloadend",
 | 
			
		||||
	"onloadstart",
 | 
			
		||||
	"onmessage",
 | 
			
		||||
	"onmessageerror",
 | 
			
		||||
	"onmousedown",
 | 
			
		||||
	"onmouseenter",
 | 
			
		||||
	"onmouseleave",
 | 
			
		||||
	"onmousemove",
 | 
			
		||||
	"onmouseout",
 | 
			
		||||
	"onmouseover",
 | 
			
		||||
	"onmouseup",
 | 
			
		||||
	"onmousewheel",
 | 
			
		||||
	"onwheel",
 | 
			
		||||
	"onoffline",
 | 
			
		||||
	"ononline",
 | 
			
		||||
	"onpagehide",
 | 
			
		||||
	"onpageshow",
 | 
			
		||||
	"onpaste",
 | 
			
		||||
	"onpause",
 | 
			
		||||
	"onplay",
 | 
			
		||||
	"onplaying",
 | 
			
		||||
@@ -585,7 +643,9 @@ var eventHandlers = []string{
 | 
			
		||||
	"onratechange",
 | 
			
		||||
	"onreset",
 | 
			
		||||
	"onresize",
 | 
			
		||||
	"onrejectionhandled",
 | 
			
		||||
	"onscroll",
 | 
			
		||||
	"onsecuritypolicyviolation",
 | 
			
		||||
	"onseeked",
 | 
			
		||||
	"onseeking",
 | 
			
		||||
	"onselect",
 | 
			
		||||
@@ -597,6 +657,7 @@ var eventHandlers = []string{
 | 
			
		||||
	"onsuspend",
 | 
			
		||||
	"ontimeupdate",
 | 
			
		||||
	"ontoggle",
 | 
			
		||||
	"onunhandledrejection",
 | 
			
		||||
	"onunload",
 | 
			
		||||
	"onvolumechange",
 | 
			
		||||
	"onwaiting",
 | 
			
		||||
@@ -604,6 +665,7 @@ var eventHandlers = []string{
 | 
			
		||||
 | 
			
		||||
// extra are ad-hoc values not covered by any of the lists above.
 | 
			
		||||
var extra = []string{
 | 
			
		||||
	"acronym",
 | 
			
		||||
	"align",
 | 
			
		||||
	"annotation",
 | 
			
		||||
	"annotation-xml",
 | 
			
		||||
@@ -639,6 +701,8 @@ var extra = []string{
 | 
			
		||||
	"plaintext",
 | 
			
		||||
	"prompt",
 | 
			
		||||
	"public",
 | 
			
		||||
	"rb",
 | 
			
		||||
	"rtc",
 | 
			
		||||
	"spacer",
 | 
			
		||||
	"strike",
 | 
			
		||||
	"svg",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1456
									
								
								vendor/golang.org/x/net/html/atom/table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1456
									
								
								vendor/golang.org/x/net/html/atom/table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										16
									
								
								vendor/golang.org/x/net/html/const.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/golang.org/x/net/html/const.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
package html
 | 
			
		||||
 | 
			
		||||
// Section 12.2.3.2 of the HTML5 specification says "The following elements
 | 
			
		||||
// Section 12.2.4.2 of the HTML5 specification says "The following elements
 | 
			
		||||
// have varying levels of special parsing rules".
 | 
			
		||||
// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements
 | 
			
		||||
var isSpecialElementMap = map[string]bool{
 | 
			
		||||
@@ -52,10 +52,12 @@ var isSpecialElementMap = map[string]bool{
 | 
			
		||||
	"iframe":     true,
 | 
			
		||||
	"img":        true,
 | 
			
		||||
	"input":      true,
 | 
			
		||||
	"isindex":    true,
 | 
			
		||||
	"isindex":    true, // The 'isindex' element has been removed, but keep it for backwards compatibility.
 | 
			
		||||
	"keygen":     true,
 | 
			
		||||
	"li":         true,
 | 
			
		||||
	"link":       true,
 | 
			
		||||
	"listing":    true,
 | 
			
		||||
	"main":       true,
 | 
			
		||||
	"marquee":    true,
 | 
			
		||||
	"menu":       true,
 | 
			
		||||
	"meta":       true,
 | 
			
		||||
@@ -95,8 +97,16 @@ func isSpecialElement(element *Node) bool {
 | 
			
		||||
	switch element.Namespace {
 | 
			
		||||
	case "", "html":
 | 
			
		||||
		return isSpecialElementMap[element.Data]
 | 
			
		||||
	case "math":
 | 
			
		||||
		switch element.Data {
 | 
			
		||||
		case "mi", "mo", "mn", "ms", "mtext", "annotation-xml":
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	case "svg":
 | 
			
		||||
		return element.Data == "foreignObject"
 | 
			
		||||
		switch element.Data {
 | 
			
		||||
		case "foreignObject", "desc", "title":
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/golang.org/x/net/html/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/golang.org/x/net/html/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -49,18 +49,18 @@ call to Next. For example, to extract an HTML page's anchor text:
 | 
			
		||||
	for {
 | 
			
		||||
		tt := z.Next()
 | 
			
		||||
		switch tt {
 | 
			
		||||
		case ErrorToken:
 | 
			
		||||
		case html.ErrorToken:
 | 
			
		||||
			return z.Err()
 | 
			
		||||
		case TextToken:
 | 
			
		||||
		case html.TextToken:
 | 
			
		||||
			if depth > 0 {
 | 
			
		||||
				// emitBytes should copy the []byte it receives,
 | 
			
		||||
				// if it doesn't process it immediately.
 | 
			
		||||
				emitBytes(z.Text())
 | 
			
		||||
			}
 | 
			
		||||
		case StartTagToken, EndTagToken:
 | 
			
		||||
		case html.StartTagToken, html.EndTagToken:
 | 
			
		||||
			tn, _ := z.TagName()
 | 
			
		||||
			if len(tn) == 1 && tn[0] == 'a' {
 | 
			
		||||
				if tt == StartTagToken {
 | 
			
		||||
				if tt == html.StartTagToken {
 | 
			
		||||
					depth++
 | 
			
		||||
				} else {
 | 
			
		||||
					depth--
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/net/html/foreign.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/net/html/foreign.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -67,7 +67,7 @@ func mathMLTextIntegrationPoint(n *Node) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.5.
 | 
			
		||||
// Section 12.2.6.5.
 | 
			
		||||
var breakout = map[string]bool{
 | 
			
		||||
	"b":          true,
 | 
			
		||||
	"big":        true,
 | 
			
		||||
@@ -115,7 +115,7 @@ var breakout = map[string]bool{
 | 
			
		||||
	"var":        true,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.5.
 | 
			
		||||
// Section 12.2.6.5.
 | 
			
		||||
var svgTagNameAdjustments = map[string]string{
 | 
			
		||||
	"altglyph":            "altGlyph",
 | 
			
		||||
	"altglyphdef":         "altGlyphDef",
 | 
			
		||||
@@ -155,7 +155,7 @@ var svgTagNameAdjustments = map[string]string{
 | 
			
		||||
	"textpath":            "textPath",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.1
 | 
			
		||||
// Section 12.2.6.1
 | 
			
		||||
var mathMLAttributeAdjustments = map[string]string{
 | 
			
		||||
	"definitionurl": "definitionURL",
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								vendor/golang.org/x/net/html/node.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/golang.org/x/net/html/node.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,9 +21,10 @@ const (
 | 
			
		||||
	scopeMarkerNode
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Section 12.2.3.3 says "scope markers are inserted when entering applet
 | 
			
		||||
// elements, buttons, object elements, marquees, table cells, and table
 | 
			
		||||
// captions, and are used to prevent formatting from 'leaking'".
 | 
			
		||||
// Section 12.2.4.3 says "The markers are inserted when entering applet,
 | 
			
		||||
// object, marquee, template, td, th, and caption elements, and are used
 | 
			
		||||
// to prevent formatting from "leaking" into applet, object, marquee,
 | 
			
		||||
// template, td, th, and caption elements".
 | 
			
		||||
var scopeMarker = Node{Type: scopeMarkerNode}
 | 
			
		||||
 | 
			
		||||
// A Node consists of a NodeType and some Data (tag name for element nodes,
 | 
			
		||||
@@ -173,6 +174,16 @@ func (s *nodeStack) index(n *Node) int {
 | 
			
		||||
	return -1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// contains returns whether a is within s.
 | 
			
		||||
func (s *nodeStack) contains(a atom.Atom) bool {
 | 
			
		||||
	for _, n := range *s {
 | 
			
		||||
		if n.DataAtom == a {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// insert inserts a node at the given index.
 | 
			
		||||
func (s *nodeStack) insert(i int, n *Node) {
 | 
			
		||||
	(*s) = append(*s, nil)
 | 
			
		||||
@@ -191,3 +202,19 @@ func (s *nodeStack) remove(n *Node) {
 | 
			
		||||
	(*s)[j] = nil
 | 
			
		||||
	*s = (*s)[:j]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type insertionModeStack []insertionMode
 | 
			
		||||
 | 
			
		||||
func (s *insertionModeStack) pop() (im insertionMode) {
 | 
			
		||||
	i := len(*s)
 | 
			
		||||
	im = (*s)[i-1]
 | 
			
		||||
	*s = (*s)[:i-1]
 | 
			
		||||
	return im
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *insertionModeStack) top() insertionMode {
 | 
			
		||||
	if i := len(*s); i > 0 {
 | 
			
		||||
		return (*s)[i-1]
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										355
									
								
								vendor/golang.org/x/net/html/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										355
									
								
								vendor/golang.org/x/net/html/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -25,20 +25,22 @@ type parser struct {
 | 
			
		||||
	hasSelfClosingToken bool
 | 
			
		||||
	// doc is the document root element.
 | 
			
		||||
	doc *Node
 | 
			
		||||
	// The stack of open elements (section 12.2.3.2) and active formatting
 | 
			
		||||
	// elements (section 12.2.3.3).
 | 
			
		||||
	// The stack of open elements (section 12.2.4.2) and active formatting
 | 
			
		||||
	// elements (section 12.2.4.3).
 | 
			
		||||
	oe, afe nodeStack
 | 
			
		||||
	// Element pointers (section 12.2.3.4).
 | 
			
		||||
	// Element pointers (section 12.2.4.4).
 | 
			
		||||
	head, form *Node
 | 
			
		||||
	// Other parsing state flags (section 12.2.3.5).
 | 
			
		||||
	// Other parsing state flags (section 12.2.4.5).
 | 
			
		||||
	scripting, framesetOK bool
 | 
			
		||||
	// The stack of template insertion modes
 | 
			
		||||
	templateStack insertionModeStack
 | 
			
		||||
	// im is the current insertion mode.
 | 
			
		||||
	im insertionMode
 | 
			
		||||
	// originalIM is the insertion mode to go back to after completing a text
 | 
			
		||||
	// or inTableText insertion mode.
 | 
			
		||||
	originalIM insertionMode
 | 
			
		||||
	// fosterParenting is whether new elements should be inserted according to
 | 
			
		||||
	// the foster parenting rules (section 12.2.5.3).
 | 
			
		||||
	// the foster parenting rules (section 12.2.6.1).
 | 
			
		||||
	fosterParenting bool
 | 
			
		||||
	// quirks is whether the parser is operating in "quirks mode."
 | 
			
		||||
	quirks bool
 | 
			
		||||
@@ -56,7 +58,7 @@ func (p *parser) top() *Node {
 | 
			
		||||
	return p.doc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stop tags for use in popUntil. These come from section 12.2.3.2.
 | 
			
		||||
// Stop tags for use in popUntil. These come from section 12.2.4.2.
 | 
			
		||||
var (
 | 
			
		||||
	defaultScopeStopTags = map[string][]a.Atom{
 | 
			
		||||
		"":     {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template},
 | 
			
		||||
@@ -79,7 +81,7 @@ const (
 | 
			
		||||
 | 
			
		||||
// popUntil pops the stack of open elements at the highest element whose tag
 | 
			
		||||
// is in matchTags, provided there is no higher element in the scope's stop
 | 
			
		||||
// tags (as defined in section 12.2.3.2). It returns whether or not there was
 | 
			
		||||
// tags (as defined in section 12.2.4.2). It returns whether or not there was
 | 
			
		||||
// such an element. If there was not, popUntil leaves the stack unchanged.
 | 
			
		||||
//
 | 
			
		||||
// For example, the set of stop tags for table scope is: "html", "table". If
 | 
			
		||||
@@ -126,7 +128,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int {
 | 
			
		||||
					return -1
 | 
			
		||||
				}
 | 
			
		||||
			case tableScope:
 | 
			
		||||
				if tagAtom == a.Html || tagAtom == a.Table {
 | 
			
		||||
				if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template {
 | 
			
		||||
					return -1
 | 
			
		||||
				}
 | 
			
		||||
			case selectScope:
 | 
			
		||||
@@ -162,17 +164,17 @@ func (p *parser) clearStackToContext(s scope) {
 | 
			
		||||
		tagAtom := p.oe[i].DataAtom
 | 
			
		||||
		switch s {
 | 
			
		||||
		case tableScope:
 | 
			
		||||
			if tagAtom == a.Html || tagAtom == a.Table {
 | 
			
		||||
			if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template {
 | 
			
		||||
				p.oe = p.oe[:i+1]
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		case tableRowScope:
 | 
			
		||||
			if tagAtom == a.Html || tagAtom == a.Tr {
 | 
			
		||||
			if tagAtom == a.Html || tagAtom == a.Tr || tagAtom == a.Template {
 | 
			
		||||
				p.oe = p.oe[:i+1]
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		case tableBodyScope:
 | 
			
		||||
			if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead {
 | 
			
		||||
			if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead || tagAtom == a.Template {
 | 
			
		||||
				p.oe = p.oe[:i+1]
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
@@ -183,7 +185,7 @@ func (p *parser) clearStackToContext(s scope) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// generateImpliedEndTags pops nodes off the stack of open elements as long as
 | 
			
		||||
// the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt.
 | 
			
		||||
// the top node has a tag name of dd, dt, li, optgroup, option, p, rb, rp, rt or rtc.
 | 
			
		||||
// If exceptions are specified, nodes with that name will not be popped off.
 | 
			
		||||
func (p *parser) generateImpliedEndTags(exceptions ...string) {
 | 
			
		||||
	var i int
 | 
			
		||||
@@ -192,7 +194,7 @@ loop:
 | 
			
		||||
		n := p.oe[i]
 | 
			
		||||
		if n.Type == ElementNode {
 | 
			
		||||
			switch n.DataAtom {
 | 
			
		||||
			case a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt:
 | 
			
		||||
			case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc:
 | 
			
		||||
				for _, except := range exceptions {
 | 
			
		||||
					if n.Data == except {
 | 
			
		||||
						break loop
 | 
			
		||||
@@ -234,9 +236,9 @@ func (p *parser) shouldFosterParent() bool {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// fosterParent adds a child node according to the foster parenting rules.
 | 
			
		||||
// Section 12.2.5.3, "foster parenting".
 | 
			
		||||
// Section 12.2.6.1, "foster parenting".
 | 
			
		||||
func (p *parser) fosterParent(n *Node) {
 | 
			
		||||
	var table, parent, prev *Node
 | 
			
		||||
	var table, parent, prev, template *Node
 | 
			
		||||
	var i int
 | 
			
		||||
	for i = len(p.oe) - 1; i >= 0; i-- {
 | 
			
		||||
		if p.oe[i].DataAtom == a.Table {
 | 
			
		||||
@@ -245,6 +247,19 @@ func (p *parser) fosterParent(n *Node) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var j int
 | 
			
		||||
	for j = len(p.oe) - 1; j >= 0; j-- {
 | 
			
		||||
		if p.oe[j].DataAtom == a.Template {
 | 
			
		||||
			template = p.oe[j]
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if template != nil && (table == nil || j > i) {
 | 
			
		||||
		template.AppendChild(n)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if table == nil {
 | 
			
		||||
		// The foster parent is the html element.
 | 
			
		||||
		parent = p.oe[0]
 | 
			
		||||
@@ -304,7 +319,7 @@ func (p *parser) addElement() {
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.3.3.
 | 
			
		||||
// Section 12.2.4.3.
 | 
			
		||||
func (p *parser) addFormattingElement() {
 | 
			
		||||
	tagAtom, attr := p.tok.DataAtom, p.tok.Attr
 | 
			
		||||
	p.addElement()
 | 
			
		||||
@@ -351,7 +366,7 @@ findIdenticalElements:
 | 
			
		||||
	p.afe = append(p.afe, p.top())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.3.3.
 | 
			
		||||
// Section 12.2.4.3.
 | 
			
		||||
func (p *parser) clearActiveFormattingElements() {
 | 
			
		||||
	for {
 | 
			
		||||
		n := p.afe.pop()
 | 
			
		||||
@@ -361,7 +376,7 @@ func (p *parser) clearActiveFormattingElements() {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.3.3.
 | 
			
		||||
// Section 12.2.4.3.
 | 
			
		||||
func (p *parser) reconstructActiveFormattingElements() {
 | 
			
		||||
	n := p.afe.top()
 | 
			
		||||
	if n == nil {
 | 
			
		||||
@@ -390,12 +405,12 @@ func (p *parser) reconstructActiveFormattingElements() {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.4.
 | 
			
		||||
// Section 12.2.5.
 | 
			
		||||
func (p *parser) acknowledgeSelfClosingTag() {
 | 
			
		||||
	p.hasSelfClosingToken = false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An insertion mode (section 12.2.3.1) is the state transition function from
 | 
			
		||||
// An insertion mode (section 12.2.4.1) is the state transition function from
 | 
			
		||||
// a particular state in the HTML5 parser's state machine. It updates the
 | 
			
		||||
// parser's fields depending on parser.tok (where ErrorToken means EOF).
 | 
			
		||||
// It returns whether the token was consumed.
 | 
			
		||||
@@ -403,7 +418,7 @@ type insertionMode func(*parser) bool
 | 
			
		||||
 | 
			
		||||
// setOriginalIM sets the insertion mode to return to after completing a text or
 | 
			
		||||
// inTableText insertion mode.
 | 
			
		||||
// Section 12.2.3.1, "using the rules for".
 | 
			
		||||
// Section 12.2.4.1, "using the rules for".
 | 
			
		||||
func (p *parser) setOriginalIM() {
 | 
			
		||||
	if p.originalIM != nil {
 | 
			
		||||
		panic("html: bad parser state: originalIM was set twice")
 | 
			
		||||
@@ -411,18 +426,38 @@ func (p *parser) setOriginalIM() {
 | 
			
		||||
	p.originalIM = p.im
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.3.1, "reset the insertion mode".
 | 
			
		||||
// Section 12.2.4.1, "reset the insertion mode".
 | 
			
		||||
func (p *parser) resetInsertionMode() {
 | 
			
		||||
	for i := len(p.oe) - 1; i >= 0; i-- {
 | 
			
		||||
		n := p.oe[i]
 | 
			
		||||
		if i == 0 && p.context != nil {
 | 
			
		||||
		last := i == 0
 | 
			
		||||
		if last && p.context != nil {
 | 
			
		||||
			n = p.context
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch n.DataAtom {
 | 
			
		||||
		case a.Select:
 | 
			
		||||
			if !last {
 | 
			
		||||
				for ancestor, first := n, p.oe[0]; ancestor != first; {
 | 
			
		||||
					if ancestor == first {
 | 
			
		||||
						break
 | 
			
		||||
					}
 | 
			
		||||
					ancestor = p.oe[p.oe.index(ancestor)-1]
 | 
			
		||||
					switch ancestor.DataAtom {
 | 
			
		||||
					case a.Template:
 | 
			
		||||
						p.im = inSelectIM
 | 
			
		||||
						return
 | 
			
		||||
					case a.Table:
 | 
			
		||||
						p.im = inSelectInTableIM
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			p.im = inSelectIM
 | 
			
		||||
		case a.Td, a.Th:
 | 
			
		||||
			// TODO: remove this divergence from the HTML5 spec.
 | 
			
		||||
			//
 | 
			
		||||
			// See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
 | 
			
		||||
			p.im = inCellIM
 | 
			
		||||
		case a.Tr:
 | 
			
		||||
			p.im = inRowIM
 | 
			
		||||
@@ -434,25 +469,41 @@ func (p *parser) resetInsertionMode() {
 | 
			
		||||
			p.im = inColumnGroupIM
 | 
			
		||||
		case a.Table:
 | 
			
		||||
			p.im = inTableIM
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			// TODO: remove this divergence from the HTML5 spec.
 | 
			
		||||
			if n.Namespace != "" {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			p.im = p.templateStack.top()
 | 
			
		||||
		case a.Head:
 | 
			
		||||
			p.im = inBodyIM
 | 
			
		||||
			// TODO: remove this divergence from the HTML5 spec.
 | 
			
		||||
			//
 | 
			
		||||
			// See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
 | 
			
		||||
			p.im = inHeadIM
 | 
			
		||||
		case a.Body:
 | 
			
		||||
			p.im = inBodyIM
 | 
			
		||||
		case a.Frameset:
 | 
			
		||||
			p.im = inFramesetIM
 | 
			
		||||
		case a.Html:
 | 
			
		||||
			if p.head == nil {
 | 
			
		||||
				p.im = beforeHeadIM
 | 
			
		||||
			} else {
 | 
			
		||||
				p.im = afterHeadIM
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			if last {
 | 
			
		||||
				p.im = inBodyIM
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.im = inBodyIM
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const whitespace = " \t\r\n\f"
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.1.
 | 
			
		||||
// Section 12.2.6.4.1.
 | 
			
		||||
func initialIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken:
 | 
			
		||||
@@ -479,7 +530,7 @@ func initialIM(p *parser) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.2.
 | 
			
		||||
// Section 12.2.6.4.2.
 | 
			
		||||
func beforeHTMLIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case DoctypeToken:
 | 
			
		||||
@@ -517,7 +568,7 @@ func beforeHTMLIM(p *parser) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.3.
 | 
			
		||||
// Section 12.2.6.4.3.
 | 
			
		||||
func beforeHeadIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken:
 | 
			
		||||
@@ -560,7 +611,7 @@ func beforeHeadIM(p *parser) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.4.
 | 
			
		||||
// Section 12.2.6.4.4.
 | 
			
		||||
func inHeadIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken:
 | 
			
		||||
@@ -590,19 +641,41 @@ func inHeadIM(p *parser) bool {
 | 
			
		||||
		case a.Head:
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			p.addElement()
 | 
			
		||||
			p.afe = append(p.afe, &scopeMarker)
 | 
			
		||||
			p.framesetOK = false
 | 
			
		||||
			p.im = inTemplateIM
 | 
			
		||||
			p.templateStack = append(p.templateStack, inTemplateIM)
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	case EndTagToken:
 | 
			
		||||
		switch p.tok.DataAtom {
 | 
			
		||||
		case a.Head:
 | 
			
		||||
			n := p.oe.pop()
 | 
			
		||||
			if n.DataAtom != a.Head {
 | 
			
		||||
				panic("html: bad parser state: <head> element not found, in the in-head insertion mode")
 | 
			
		||||
			}
 | 
			
		||||
			p.oe.pop()
 | 
			
		||||
			p.im = afterHeadIM
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Body, a.Html, a.Br:
 | 
			
		||||
			p.parseImpliedToken(EndTagToken, a.Head, a.Head.String())
 | 
			
		||||
			return false
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			if !p.oe.contains(a.Template) {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			// TODO: remove this divergence from the HTML5 spec.
 | 
			
		||||
			//
 | 
			
		||||
			// See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
 | 
			
		||||
			p.generateImpliedEndTags()
 | 
			
		||||
			for i := len(p.oe) - 1; i >= 0; i-- {
 | 
			
		||||
				if n := p.oe[i]; n.Namespace == "" && n.DataAtom == a.Template {
 | 
			
		||||
					p.oe = p.oe[:i]
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			p.clearActiveFormattingElements()
 | 
			
		||||
			p.templateStack.pop()
 | 
			
		||||
			p.resetInsertionMode()
 | 
			
		||||
			return true
 | 
			
		||||
		default:
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
@@ -622,7 +695,7 @@ func inHeadIM(p *parser) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.6.
 | 
			
		||||
// Section 12.2.6.4.6.
 | 
			
		||||
func afterHeadIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken:
 | 
			
		||||
@@ -648,7 +721,7 @@ func afterHeadIM(p *parser) bool {
 | 
			
		||||
			p.addElement()
 | 
			
		||||
			p.im = inFramesetIM
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:
 | 
			
		||||
		case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
 | 
			
		||||
			p.oe = append(p.oe, p.head)
 | 
			
		||||
			defer p.oe.remove(p.head)
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
@@ -660,6 +733,8 @@ func afterHeadIM(p *parser) bool {
 | 
			
		||||
		switch p.tok.DataAtom {
 | 
			
		||||
		case a.Body, a.Html, a.Br:
 | 
			
		||||
			// Drop down to creating an implied <body> tag.
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		default:
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
@@ -697,7 +772,7 @@ func copyAttributes(dst *Node, src Token) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.7.
 | 
			
		||||
// Section 12.2.6.4.7.
 | 
			
		||||
func inBodyIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken:
 | 
			
		||||
@@ -727,10 +802,16 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
	case StartTagToken:
 | 
			
		||||
		switch p.tok.DataAtom {
 | 
			
		||||
		case a.Html:
 | 
			
		||||
			if p.oe.contains(a.Template) {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			copyAttributes(p.oe[0], p.tok)
 | 
			
		||||
		case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:
 | 
			
		||||
		case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		case a.Body:
 | 
			
		||||
			if p.oe.contains(a.Template) {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			if len(p.oe) >= 2 {
 | 
			
		||||
				body := p.oe[1]
 | 
			
		||||
				if body.Type == ElementNode && body.DataAtom == a.Body {
 | 
			
		||||
@@ -767,9 +848,13 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
			// The newline, if any, will be dealt with by the TextToken case.
 | 
			
		||||
			p.framesetOK = false
 | 
			
		||||
		case a.Form:
 | 
			
		||||
			if p.form == nil {
 | 
			
		||||
			if p.form != nil && !p.oe.contains(a.Template) {
 | 
			
		||||
				// Ignore the token
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			p.popUntil(buttonScope, a.P)
 | 
			
		||||
			p.addElement()
 | 
			
		||||
			if !p.oe.contains(a.Template) {
 | 
			
		||||
				p.form = p.top()
 | 
			
		||||
			}
 | 
			
		||||
		case a.Li:
 | 
			
		||||
@@ -903,6 +988,14 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
			p.acknowledgeSelfClosingTag()
 | 
			
		||||
			p.popUntil(buttonScope, a.P)
 | 
			
		||||
			p.parseImpliedToken(StartTagToken, a.Form, a.Form.String())
 | 
			
		||||
			if p.form == nil {
 | 
			
		||||
				// NOTE: The 'isindex' element has been removed,
 | 
			
		||||
				// and the 'template' element has not been designed to be
 | 
			
		||||
				// collaborative with the index element.
 | 
			
		||||
				//
 | 
			
		||||
				// Ignore the token.
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			if action != "" {
 | 
			
		||||
				p.form.Attr = []Attribute{{Key: "action", Val: action}}
 | 
			
		||||
			}
 | 
			
		||||
@@ -952,11 +1045,16 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
			}
 | 
			
		||||
			p.reconstructActiveFormattingElements()
 | 
			
		||||
			p.addElement()
 | 
			
		||||
		case a.Rp, a.Rt:
 | 
			
		||||
		case a.Rb, a.Rtc:
 | 
			
		||||
			if p.elementInScope(defaultScope, a.Ruby) {
 | 
			
		||||
				p.generateImpliedEndTags()
 | 
			
		||||
			}
 | 
			
		||||
			p.addElement()
 | 
			
		||||
		case a.Rp, a.Rt:
 | 
			
		||||
			if p.elementInScope(defaultScope, a.Ruby) {
 | 
			
		||||
				p.generateImpliedEndTags("rtc")
 | 
			
		||||
			}
 | 
			
		||||
			p.addElement()
 | 
			
		||||
		case a.Math, a.Svg:
 | 
			
		||||
			p.reconstructActiveFormattingElements()
 | 
			
		||||
			if p.tok.DataAtom == a.Math {
 | 
			
		||||
@@ -993,6 +1091,19 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
 | 
			
		||||
			p.popUntil(defaultScope, p.tok.DataAtom)
 | 
			
		||||
		case a.Form:
 | 
			
		||||
			if p.oe.contains(a.Template) {
 | 
			
		||||
				i := p.indexOfElementInScope(defaultScope, a.Form)
 | 
			
		||||
				if i == -1 {
 | 
			
		||||
					// Ignore the token.
 | 
			
		||||
					return true
 | 
			
		||||
				}
 | 
			
		||||
				p.generateImpliedEndTags()
 | 
			
		||||
				if p.oe[i].DataAtom != a.Form {
 | 
			
		||||
					// Ignore the token.
 | 
			
		||||
					return true
 | 
			
		||||
				}
 | 
			
		||||
				p.popUntil(defaultScope, a.Form)
 | 
			
		||||
			} else {
 | 
			
		||||
				node := p.form
 | 
			
		||||
				p.form = nil
 | 
			
		||||
				i := p.indexOfElementInScope(defaultScope, a.Form)
 | 
			
		||||
@@ -1002,6 +1113,7 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
				}
 | 
			
		||||
				p.generateImpliedEndTags()
 | 
			
		||||
				p.oe.remove(node)
 | 
			
		||||
			}
 | 
			
		||||
		case a.P:
 | 
			
		||||
			if !p.elementInScope(buttonScope, a.P) {
 | 
			
		||||
				p.parseImpliedToken(StartTagToken, a.P, a.P.String())
 | 
			
		||||
@@ -1022,6 +1134,8 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
		case a.Br:
 | 
			
		||||
			p.tok.Type = StartTagToken
 | 
			
		||||
			return false
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		default:
 | 
			
		||||
			p.inBodyEndTagOther(p.tok.DataAtom)
 | 
			
		||||
		}
 | 
			
		||||
@@ -1030,6 +1144,21 @@ func inBodyIM(p *parser) bool {
 | 
			
		||||
			Type: CommentNode,
 | 
			
		||||
			Data: p.tok.Data,
 | 
			
		||||
		})
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
		// TODO: remove this divergence from the HTML5 spec.
 | 
			
		||||
		if len(p.templateStack) > 0 {
 | 
			
		||||
			p.im = inTemplateIM
 | 
			
		||||
			return false
 | 
			
		||||
		} else {
 | 
			
		||||
			for _, e := range p.oe {
 | 
			
		||||
				switch e.DataAtom {
 | 
			
		||||
				case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc, a.Tbody, a.Td, a.Tfoot, a.Th,
 | 
			
		||||
					a.Thead, a.Tr, a.Body, a.Html:
 | 
			
		||||
				default:
 | 
			
		||||
					return true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
@@ -1160,7 +1289,7 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM.
 | 
			
		||||
// "Any other end tag" handling from 12.2.5.5 The rules for parsing tokens in foreign content
 | 
			
		||||
// "Any other end tag" handling from 12.2.6.5 The rules for parsing tokens in foreign content
 | 
			
		||||
// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign
 | 
			
		||||
func (p *parser) inBodyEndTagOther(tagAtom a.Atom) {
 | 
			
		||||
	for i := len(p.oe) - 1; i >= 0; i-- {
 | 
			
		||||
@@ -1174,7 +1303,7 @@ func (p *parser) inBodyEndTagOther(tagAtom a.Atom) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.8.
 | 
			
		||||
// Section 12.2.6.4.8.
 | 
			
		||||
func textIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
@@ -1203,12 +1332,9 @@ func textIM(p *parser) bool {
 | 
			
		||||
	return p.tok.Type == EndTagToken
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.9.
 | 
			
		||||
// Section 12.2.6.4.9.
 | 
			
		||||
func inTableIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
		// Stop parsing.
 | 
			
		||||
		return true
 | 
			
		||||
	case TextToken:
 | 
			
		||||
		p.tok.Data = strings.Replace(p.tok.Data, "\x00", "", -1)
 | 
			
		||||
		switch p.oe.top().DataAtom {
 | 
			
		||||
@@ -1249,7 +1375,7 @@ func inTableIM(p *parser) bool {
 | 
			
		||||
			}
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Style, a.Script:
 | 
			
		||||
		case a.Style, a.Script, a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		case a.Input:
 | 
			
		||||
			for _, t := range p.tok.Attr {
 | 
			
		||||
@@ -1261,7 +1387,7 @@ func inTableIM(p *parser) bool {
 | 
			
		||||
			}
 | 
			
		||||
			// Otherwise drop down to the default action.
 | 
			
		||||
		case a.Form:
 | 
			
		||||
			if p.form != nil {
 | 
			
		||||
			if p.oe.contains(a.Template) || p.form != nil {
 | 
			
		||||
				// Ignore the token.
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
@@ -1291,6 +1417,8 @@ func inTableIM(p *parser) bool {
 | 
			
		||||
		case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		}
 | 
			
		||||
	case CommentToken:
 | 
			
		||||
		p.addChild(&Node{
 | 
			
		||||
@@ -1301,6 +1429,8 @@ func inTableIM(p *parser) bool {
 | 
			
		||||
	case DoctypeToken:
 | 
			
		||||
		// Ignore the token.
 | 
			
		||||
		return true
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
		return inBodyIM(p)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p.fosterParenting = true
 | 
			
		||||
@@ -1309,7 +1439,7 @@ func inTableIM(p *parser) bool {
 | 
			
		||||
	return inBodyIM(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.11.
 | 
			
		||||
// Section 12.2.6.4.11.
 | 
			
		||||
func inCaptionIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case StartTagToken:
 | 
			
		||||
@@ -1355,7 +1485,7 @@ func inCaptionIM(p *parser) bool {
 | 
			
		||||
	return inBodyIM(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.12.
 | 
			
		||||
// Section 12.2.6.4.12.
 | 
			
		||||
func inColumnGroupIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken:
 | 
			
		||||
@@ -1386,11 +1516,13 @@ func inColumnGroupIM(p *parser) bool {
 | 
			
		||||
			p.oe.pop()
 | 
			
		||||
			p.acknowledgeSelfClosingTag()
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		}
 | 
			
		||||
	case EndTagToken:
 | 
			
		||||
		switch p.tok.DataAtom {
 | 
			
		||||
		case a.Colgroup:
 | 
			
		||||
			if p.oe.top().DataAtom != a.Html {
 | 
			
		||||
			if p.oe.top().DataAtom == a.Colgroup {
 | 
			
		||||
				p.oe.pop()
 | 
			
		||||
				p.im = inTableIM
 | 
			
		||||
			}
 | 
			
		||||
@@ -1398,17 +1530,21 @@ func inColumnGroupIM(p *parser) bool {
 | 
			
		||||
		case a.Col:
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		}
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
		return inBodyIM(p)
 | 
			
		||||
	}
 | 
			
		||||
	if p.oe.top().DataAtom != a.Colgroup {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if p.oe.top().DataAtom != a.Html {
 | 
			
		||||
	p.oe.pop()
 | 
			
		||||
	p.im = inTableIM
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.13.
 | 
			
		||||
// Section 12.2.6.4.13.
 | 
			
		||||
func inTableBodyIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case StartTagToken:
 | 
			
		||||
@@ -1460,7 +1596,7 @@ func inTableBodyIM(p *parser) bool {
 | 
			
		||||
	return inTableIM(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.14.
 | 
			
		||||
// Section 12.2.6.4.14.
 | 
			
		||||
func inRowIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case StartTagToken:
 | 
			
		||||
@@ -1511,7 +1647,7 @@ func inRowIM(p *parser) bool {
 | 
			
		||||
	return inTableIM(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.15.
 | 
			
		||||
// Section 12.2.6.4.15.
 | 
			
		||||
func inCellIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case StartTagToken:
 | 
			
		||||
@@ -1560,12 +1696,9 @@ func inCellIM(p *parser) bool {
 | 
			
		||||
	return inBodyIM(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.16.
 | 
			
		||||
// Section 12.2.6.4.16.
 | 
			
		||||
func inSelectIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
		// Stop parsing.
 | 
			
		||||
		return true
 | 
			
		||||
	case TextToken:
 | 
			
		||||
		p.addText(strings.Replace(p.tok.Data, "\x00", "", -1))
 | 
			
		||||
	case StartTagToken:
 | 
			
		||||
@@ -1597,7 +1730,7 @@ func inSelectIM(p *parser) bool {
 | 
			
		||||
			p.tokenizer.NextIsNotRawText()
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
		case a.Script:
 | 
			
		||||
		case a.Script, a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		}
 | 
			
		||||
	case EndTagToken:
 | 
			
		||||
@@ -1618,6 +1751,8 @@ func inSelectIM(p *parser) bool {
 | 
			
		||||
			if p.popUntil(selectScope, a.Select) {
 | 
			
		||||
				p.resetInsertionMode()
 | 
			
		||||
			}
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		}
 | 
			
		||||
	case CommentToken:
 | 
			
		||||
		p.addChild(&Node{
 | 
			
		||||
@@ -1627,12 +1762,14 @@ func inSelectIM(p *parser) bool {
 | 
			
		||||
	case DoctypeToken:
 | 
			
		||||
		// Ignore the token.
 | 
			
		||||
		return true
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
		return inBodyIM(p)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.17.
 | 
			
		||||
// Section 12.2.6.4.17.
 | 
			
		||||
func inSelectInTableIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case StartTagToken, EndTagToken:
 | 
			
		||||
@@ -1650,7 +1787,73 @@ func inSelectInTableIM(p *parser) bool {
 | 
			
		||||
	return inSelectIM(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.18.
 | 
			
		||||
// Section 12.2.6.4.18.
 | 
			
		||||
func inTemplateIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken, CommentToken, DoctypeToken:
 | 
			
		||||
		return inBodyIM(p)
 | 
			
		||||
	case StartTagToken:
 | 
			
		||||
		switch p.tok.DataAtom {
 | 
			
		||||
		case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		case a.Caption, a.Colgroup, a.Tbody, a.Tfoot, a.Thead:
 | 
			
		||||
			p.templateStack.pop()
 | 
			
		||||
			p.templateStack = append(p.templateStack, inTableIM)
 | 
			
		||||
			p.im = inTableIM
 | 
			
		||||
			return false
 | 
			
		||||
		case a.Col:
 | 
			
		||||
			p.templateStack.pop()
 | 
			
		||||
			p.templateStack = append(p.templateStack, inColumnGroupIM)
 | 
			
		||||
			p.im = inColumnGroupIM
 | 
			
		||||
			return false
 | 
			
		||||
		case a.Tr:
 | 
			
		||||
			p.templateStack.pop()
 | 
			
		||||
			p.templateStack = append(p.templateStack, inTableBodyIM)
 | 
			
		||||
			p.im = inTableBodyIM
 | 
			
		||||
			return false
 | 
			
		||||
		case a.Td, a.Th:
 | 
			
		||||
			p.templateStack.pop()
 | 
			
		||||
			p.templateStack = append(p.templateStack, inRowIM)
 | 
			
		||||
			p.im = inRowIM
 | 
			
		||||
			return false
 | 
			
		||||
		default:
 | 
			
		||||
			p.templateStack.pop()
 | 
			
		||||
			p.templateStack = append(p.templateStack, inBodyIM)
 | 
			
		||||
			p.im = inBodyIM
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	case EndTagToken:
 | 
			
		||||
		switch p.tok.DataAtom {
 | 
			
		||||
		case a.Template:
 | 
			
		||||
			return inHeadIM(p)
 | 
			
		||||
		default:
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
		if !p.oe.contains(a.Template) {
 | 
			
		||||
			// Ignore the token.
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		// TODO: remove this divergence from the HTML5 spec.
 | 
			
		||||
		//
 | 
			
		||||
		// See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
 | 
			
		||||
		p.generateImpliedEndTags()
 | 
			
		||||
		for i := len(p.oe) - 1; i >= 0; i-- {
 | 
			
		||||
			if n := p.oe[i]; n.Namespace == "" && n.DataAtom == a.Template {
 | 
			
		||||
				p.oe = p.oe[:i]
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		p.clearActiveFormattingElements()
 | 
			
		||||
		p.templateStack.pop()
 | 
			
		||||
		p.resetInsertionMode()
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.6.4.19.
 | 
			
		||||
func afterBodyIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
@@ -1688,7 +1891,7 @@ func afterBodyIM(p *parser) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.19.
 | 
			
		||||
// Section 12.2.6.4.20.
 | 
			
		||||
func inFramesetIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case CommentToken:
 | 
			
		||||
@@ -1738,7 +1941,7 @@ func inFramesetIM(p *parser) bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.20.
 | 
			
		||||
// Section 12.2.6.4.21.
 | 
			
		||||
func afterFramesetIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case CommentToken:
 | 
			
		||||
@@ -1777,7 +1980,7 @@ func afterFramesetIM(p *parser) bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.21.
 | 
			
		||||
// Section 12.2.6.4.22.
 | 
			
		||||
func afterAfterBodyIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case ErrorToken:
 | 
			
		||||
@@ -1806,7 +2009,7 @@ func afterAfterBodyIM(p *parser) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.4.22.
 | 
			
		||||
// Section 12.2.6.4.23.
 | 
			
		||||
func afterAfterFramesetIM(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case CommentToken:
 | 
			
		||||
@@ -1844,7 +2047,7 @@ func afterAfterFramesetIM(p *parser) bool {
 | 
			
		||||
 | 
			
		||||
const whitespaceOrNUL = whitespace + "\x00"
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.5.
 | 
			
		||||
// Section 12.2.6.5
 | 
			
		||||
func parseForeignContent(p *parser) bool {
 | 
			
		||||
	switch p.tok.Type {
 | 
			
		||||
	case TextToken:
 | 
			
		||||
@@ -1924,7 +2127,7 @@ func parseForeignContent(p *parser) bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Section 12.2.5.
 | 
			
		||||
// Section 12.2.6.
 | 
			
		||||
func (p *parser) inForeignContent() bool {
 | 
			
		||||
	if len(p.oe) == 0 {
 | 
			
		||||
		return false
 | 
			
		||||
@@ -2012,6 +2215,15 @@ func (p *parser) parse() error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parse returns the parse tree for the HTML from the given Reader.
 | 
			
		||||
//
 | 
			
		||||
// It implements the HTML5 parsing algorithm
 | 
			
		||||
// (https://html.spec.whatwg.org/multipage/syntax.html#tree-construction),
 | 
			
		||||
// which is very complicated. The resultant tree can contain implicitly created
 | 
			
		||||
// nodes that have no explicit <tag> listed in r's data, and nodes' parents can
 | 
			
		||||
// differ from the nesting implied by a naive processing of start and end
 | 
			
		||||
// <tag>s. Conversely, explicit <tag>s in r's data can be silently dropped,
 | 
			
		||||
// with no corresponding node in the resulting tree.
 | 
			
		||||
//
 | 
			
		||||
// The input is assumed to be UTF-8 encoded.
 | 
			
		||||
func Parse(r io.Reader) (*Node, error) {
 | 
			
		||||
	p := &parser{
 | 
			
		||||
@@ -2033,6 +2245,8 @@ func Parse(r io.Reader) (*Node, error) {
 | 
			
		||||
// ParseFragment parses a fragment of HTML and returns the nodes that were
 | 
			
		||||
// found. If the fragment is the InnerHTML for an existing element, pass that
 | 
			
		||||
// element in context.
 | 
			
		||||
//
 | 
			
		||||
// It has the same intricacies as Parse.
 | 
			
		||||
func ParseFragment(r io.Reader, context *Node) ([]*Node, error) {
 | 
			
		||||
	contextTag := ""
 | 
			
		||||
	if context != nil {
 | 
			
		||||
@@ -2064,6 +2278,9 @@ func ParseFragment(r io.Reader, context *Node) ([]*Node, error) {
 | 
			
		||||
	}
 | 
			
		||||
	p.doc.AppendChild(root)
 | 
			
		||||
	p.oe = nodeStack{root}
 | 
			
		||||
	if context != nil && context.DataAtom == a.Template {
 | 
			
		||||
		p.templateStack = append(p.templateStack, inTemplateIM)
 | 
			
		||||
	}
 | 
			
		||||
	p.resetInsertionMode()
 | 
			
		||||
 | 
			
		||||
	for n := context; n != nil; n = n.Parent {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/net/html/token.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/net/html/token.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1161,8 +1161,8 @@ func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) {
 | 
			
		||||
	return nil, nil, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Token returns the next Token. The result's Data and Attr values remain valid
 | 
			
		||||
// after subsequent Next calls.
 | 
			
		||||
// Token returns the current Token. The result's Data and Attr values remain
 | 
			
		||||
// valid after subsequent Next calls.
 | 
			
		||||
func (z *Tokenizer) Token() Token {
 | 
			
		||||
	t := Token{Type: z.tt}
 | 
			
		||||
	switch z.tt {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user