src/pkg/html/node.go | 2 ++
src/pkg/html/parse.go | 11 +++++++----
src/pkg/html/parse_test.go | 2 +-
diff --git a/src/pkg/html/node.go b/src/pkg/html/node.go
index 4ecfd6ca238e45ef47005bb7f5e91f6a46a9b5e0..5ca6035c118aac8051a8baf8dd34926d39106d6d 100644
--- a/src/pkg/html/node.go
+++ b/src/pkg/html/node.go
@@ -135,6 +135,8 @@ (*s)[j] = nil
*s = (*s)[:j]
}
+// TODO(nigeltao): forTag no longer used. Should it be deleted?
+
// forTag returns the top-most element node with the given tag.
func (s *nodeStack) forTag(tag string) *Node {
for i := len(*s) - 1; i >= 0; i-- {
diff --git a/src/pkg/html/parse.go b/src/pkg/html/parse.go
index 2538ea98115116d5a1360439c1978c258e955464..54f7e2e8a55debaae9df9046aa2436c6271b46c0 100644
--- a/src/pkg/html/parse.go
+++ b/src/pkg/html/parse.go
@@ -553,10 +553,13 @@ p.oe.pop()
}
p.addElement(p.tok.Data, p.tok.Attr)
case "a":
- if n := p.afe.forTag("a"); n != nil {
- p.inBodyEndTagFormatting("a")
- p.oe.remove(n)
- p.afe.remove(n)
+ for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
+ if n := p.afe[i]; n.Type == ElementNode && n.Data == "a" {
+ p.inBodyEndTagFormatting("a")
+ p.oe.remove(n)
+ p.afe.remove(n)
+ break
+ }
}
p.reconstructActiveFormattingElements()
p.addFormattingElement(p.tok.Data, p.tok.Attr)
diff --git a/src/pkg/html/parse_test.go b/src/pkg/html/parse_test.go
index 067eb26d04f46ad2a6b5be0acef6751e7df30ba8..b9572fa12344607658ba2bbd8a74bea3e9b117a8 100644
--- a/src/pkg/html/parse_test.go
+++ b/src/pkg/html/parse_test.go
@@ -132,7 +132,7 @@ for _, filename := range filenames {
rc := make(chan io.Reader)
go readDat(filename, rc)
// TODO(nigeltao): Process all test cases, not just a subset.
- for i := 0; i < 78; i++ {
+ for i := 0; i < 80; i++ {
// Parse the #data section.
b, err := ioutil.ReadAll(<-rc)
if err != nil {