Changeset 62926 in webkit


Ignore:
Timestamp:
Jul 9, 2010 3:10:57 AM (14 years ago)
Author:
eric@webkit.org
Message:

2010-07-09 Eric Seidel <eric@webkit.org>

Reviewed by Adam Barth.

Implement self closing start tag state in the tokenizer
https://bugs.webkit.org/show_bug.cgi?id=41946

  • html5lib/runner-expected-html5.txt:
    • Yay progressions!

2010-07-09 Eric Seidel <eric@webkit.org>

Reviewed by Adam Barth.

Implement self closing start tag state in the tokenizer
https://bugs.webkit.org/show_bug.cgi?id=41946

Amazingly we got this far w/o needing self closing.
The LegacyHTMLTreeBuilder clearly uses the self-closing
state, but the fact that we never exposed it seems to
not have caused any test failures. Sad.

The new HTMLTreeBuilder only needs the self closing state
for foreign content mode (and a few parse error cases).

  • html/HTMLToken.h: (WebCore::HTMLToken::setSelfClosing):
  • html/HTMLTokenizer.cpp: (WebCore::HTMLTokenizer::nextToken):
  • html/HTMLTreeBuilder.cpp: (WebCore::):
Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r62925 r62926  
     12010-07-09  Eric Seidel  <eric@webkit.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        Implement self closing start tag state in the tokenizer
     6        https://bugs.webkit.org/show_bug.cgi?id=41946
     7
     8        * html5lib/runner-expected-html5.txt:
     9         - Yay progressions!
     10
     112010-07-09  Eric Seidel  <eric@webkit.org>
     12
     13        Reviewed by Adam Barth.
     14
     15        Add basic "in foreign content" support to the TreeBuilder
     16        https://bugs.webkit.org/show_bug.cgi?id=41943
     17
     18        Update our results now that we pass a bunch more tests.
     19
     20        * html5lib/runner-expected-html5.txt:
     21
    1222010-07-09  Nikolas Zimmermann  <nzimmermann@rim.com>
    223
  • trunk/LayoutTests/html5lib/runner-expected-html5.txt

    r62924 r62926  
    964964|       "bar"
    965965resources/tests10.dat:
    966 1
    967 2
    968 5
    969 6
    970 7
    971 8
    972 9
    973 10
    974 11
    975 12
    97696613
    97796714
     
    98497425
    985975
    986 Test 1 of 25 in resources/tests10.dat failed. Input:
    987 <!DOCTYPE html><svg></svg>
    988 Got:
    989 | <!DOCTYPE html>
    990 | <html>
    991 |   <head>
    992 |   <body>
    993 |     <svg>
    994 Expected:
    995 | <!DOCTYPE html>
    996 | <html>
    997 |   <head>
    998 |   <body>
    999 |     <svg svg>
    1000 
    1001 Test 2 of 25 in resources/tests10.dat failed. Input:
    1002 <!DOCTYPE html><body><svg></svg>
    1003 Got:
    1004 | <!DOCTYPE html>
    1005 | <html>
    1006 |   <head>
    1007 |   <body>
    1008 |     <svg>
    1009 Expected:
    1010 | <!DOCTYPE html>
    1011 | <html>
    1012 |   <head>
    1013 |   <body>
    1014 |     <svg svg>
    1015 
    1016 Test 5 of 25 in resources/tests10.dat failed. Input:
    1017 <!DOCTYPE html><body><table><svg></svg></table>
    1018 Got:
    1019 | <!DOCTYPE html>
    1020 | <html>
    1021 |   <head>
    1022 |   <body>
    1023 |     <svg>
    1024 |     <table>
    1025 Expected:
    1026 | <!DOCTYPE html>
    1027 | <html>
    1028 |   <head>
    1029 |   <body>
    1030 |     <svg svg>
    1031 |     <table>
    1032 
    1033 Test 6 of 25 in resources/tests10.dat failed. Input:
    1034 <!DOCTYPE html><body><table><svg><g>foo</g></svg></table>
    1035 Got:
    1036 | <!DOCTYPE html>
    1037 | <html>
    1038 |   <head>
    1039 |   <body>
    1040 |     <svg>
    1041 |       <g>
    1042 |         "foo"
    1043 |     <table>
    1044 Expected:
    1045 | <!DOCTYPE html>
    1046 | <html>
    1047 |   <head>
    1048 |   <body>
    1049 |     <svg svg>
    1050 |       <svg g>
    1051 |         "foo"
    1052 |     <table>
    1053 
    1054 Test 7 of 25 in resources/tests10.dat failed. Input:
    1055 <!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table>
    1056 Got:
    1057 | <!DOCTYPE html>
    1058 | <html>
    1059 |   <head>
    1060 |   <body>
    1061 |     <svg>
    1062 |       <g>
    1063 |         "foo"
    1064 |       <g>
    1065 |         "bar"
    1066 |     <table>
    1067 Expected:
    1068 | <!DOCTYPE html>
    1069 | <html>
    1070 |   <head>
    1071 |   <body>
    1072 |     <svg svg>
    1073 |       <svg g>
    1074 |         "foo"
    1075 |       <svg g>
    1076 |         "bar"
    1077 |     <table>
    1078 
    1079 Test 8 of 25 in resources/tests10.dat failed. Input:
    1080 <!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table>
    1081 Got:
    1082 | <!DOCTYPE html>
    1083 | <html>
    1084 |   <head>
    1085 |   <body>
    1086 |     <svg>
    1087 |       <g>
    1088 |         "foo"
    1089 |       <g>
    1090 |         "bar"
    1091 |     <table>
    1092 |       <tbody>
    1093 Expected:
    1094 | <!DOCTYPE html>
    1095 | <html>
    1096 |   <head>
    1097 |   <body>
    1098 |     <svg svg>
    1099 |       <svg g>
    1100 |         "foo"
    1101 |       <svg g>
    1102 |         "bar"
    1103 |     <table>
    1104 |       <tbody>
    1105 
    1106 Test 9 of 25 in resources/tests10.dat failed. Input:
    1107 <!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table>
    1108 Got:
    1109 | <!DOCTYPE html>
    1110 | <html>
    1111 |   <head>
    1112 |   <body>
    1113 |     <svg>
    1114 |       <g>
    1115 |         "foo"
    1116 |       <g>
    1117 |         "bar"
    1118 |     <table>
    1119 |       <tbody>
    1120 |         <tr>
    1121 Expected:
    1122 | <!DOCTYPE html>
    1123 | <html>
    1124 |   <head>
    1125 |   <body>
    1126 |     <svg svg>
    1127 |       <svg g>
    1128 |         "foo"
    1129 |       <svg g>
    1130 |         "bar"
    1131 |     <table>
    1132 |       <tbody>
    1133 |         <tr>
    1134 
    1135 Test 10 of 25 in resources/tests10.dat failed. Input:
    1136 <!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table>
    1137 Got:
    1138 | <!DOCTYPE html>
    1139 | <html>
    1140 |   <head>
    1141 |   <body>
    1142 |     <table>
    1143 |       <tbody>
    1144 |         <tr>
    1145 |           <td>
    1146 |             <svg>
    1147 |               <g>
    1148 |                 "foo"
    1149 |               <g>
    1150 |                 "bar"
    1151 Expected:
    1152 | <!DOCTYPE html>
    1153 | <html>
    1154 |   <head>
    1155 |   <body>
    1156 |     <table>
    1157 |       <tbody>
    1158 |         <tr>
    1159 |           <td>
    1160 |             <svg svg>
    1161 |               <svg g>
    1162 |                 "foo"
    1163 |               <svg g>
    1164 |                 "bar"
    1165 
    1166 Test 11 of 25 in resources/tests10.dat failed. Input:
    1167 <!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table>
    1168 Got:
    1169 | <!DOCTYPE html>
    1170 | <html>
    1171 |   <head>
    1172 |   <body>
    1173 |     <table>
    1174 |       <tbody>
    1175 |         <tr>
    1176 |           <td>
    1177 |             <svg>
    1178 |               <g>
    1179 |                 "foo"
    1180 |               <g>
    1181 |                 "bar"
    1182 |             <p>
    1183 |               "baz"
    1184 Expected:
    1185 | <!DOCTYPE html>
    1186 | <html>
    1187 |   <head>
    1188 |   <body>
    1189 |     <table>
    1190 |       <tbody>
    1191 |         <tr>
    1192 |           <td>
    1193 |             <svg svg>
    1194 |               <svg g>
    1195 |                 "foo"
    1196 |               <svg g>
    1197 |                 "bar"
    1198 |             <p>
    1199 |               "baz"
    1200 
    1201 Test 12 of 25 in resources/tests10.dat failed. Input:
    1202 <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table>
    1203 Got:
    1204 | <!DOCTYPE html>
    1205 | <html>
    1206 |   <head>
    1207 |   <body>
    1208 |     <table>
    1209 |       <caption>
    1210 |         <svg>
    1211 |           <g>
    1212 |             "foo"
    1213 |           <g>
    1214 |             "bar"
    1215 |         <p>
    1216 |           "baz"
    1217 Expected:
     976Test 13 of 25 in resources/tests10.dat failed. Input:
     977<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
     978Got:
    1218979| <!DOCTYPE html>
    1219980| <html>
     
    1227988|           <svg g>
    1228989|             "bar"
    1229 |         <p>
    1230 |           "baz"
    1231 
    1232 Test 13 of 25 in resources/tests10.dat failed. Input:
    1233 <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
    1234 Got:
    1235 | <!DOCTYPE html>
    1236 | <html>
    1237 |   <head>
    1238 |   <body>
    1239 |     <table>
    1240 |       <caption>
    1241 |         <svg>
    1242 |           <g>
    1243 |             "foo"
    1244 |           <g>
    1245 |             "bar"
    1246 |           <p>
     990|           <svg p>
    1247991|             "baz"
    1248 |     <p>
    1249 |       "quux"
     992|             <svg p>
     993|               "quux"
    1250994Expected:
    1251995| <!DOCTYPE html>
     
    12741018|     <table>
    12751019|       <caption>
    1276 |         <svg>
    1277 |           <g>
     1020|         <svg svg>
     1021|           <svg g>
    12781022|             "foo"
    1279 |           <g>
     1023|           <svg g>
    12801024|             "bar"
    12811025|           "baz"
    1282 |     <p>
    1283 |       "quux"
     1026|           <svg p>
     1027|             "quux"
    12841028Expected:
    12851029| <!DOCTYPE html>
     
    13051049|   <head>
    13061050|   <body>
    1307 |     <svg>
    1308 |       <g>
     1051|     <svg svg>
     1052|       <svg g>
    13091053|         "foo"
    1310 |       <g>
     1054|       <svg g>
    13111055|         "bar"
    1312 |       <p>
     1056|       <svg p>
    13131057|         "baz"
     1058|         <svg p>
     1059|           "quux"
    13141060|     <table>
    13151061|       <colgroup>
    1316 |     <p>
    1317 |       "quux"
    13181062Expected:
    13191063| <!DOCTYPE html>
     
    13401084|   <head>
    13411085|   <body>
    1342 |     <svg>
    1343 |       <g>
     1086|     <svg svg>
     1087|       <svg g>
    13441088|         "foo"
    1345 |       <g>
     1089|       <svg g>
    13461090|         "bar"
    1347 |       <p>
     1091|       <svg p>
    13481092|         "baz"
    13491093Expected:
     
    13671111|   <head>
    13681112|   <body>
    1369 |     <svg>
    1370 |       <g>
     1113|     <svg svg>
     1114|       <svg g>
    13711115|         "foo"
    1372 |       <g>
     1116|       <svg g>
    13731117|         "bar"
    1374 |       <p>
     1118|       <svg p>
    13751119|         "baz"
    13761120Expected:
     
    13951139|   <body>
    13961140|     xlink:href="foo"
    1397 |     <svg>
     1141|     <svg svg>
    13981142|       xlink:href="foo"
    13991143Expected:
     
    14151159|     xlink:href="foo"
    14161160|     xml:lang="en"
    1417 |     <svg>
    1418 |       <g>
     1161|     <svg svg>
     1162|       <svg g>
    14191163|         xlink:href="foo"
    14201164|         xml:lang="en"
     
    14401184|     xlink:href="foo"
    14411185|     xml:lang="en"
    1442 |     <svg>
    1443 |       <g>
     1186|     <svg svg>
     1187|       <svg g>
    14441188|         xlink:href="foo"
    14451189|         xml:lang="en"
     
    14651209|     xlink:href="foo"
    14661210|     xml:lang="en"
    1467 |     <svg>
    1468 |       <g>
     1211|     <svg svg>
     1212|       <svg g>
    14691213|         xlink:href="foo"
    14701214|         xml:lang="en"
    1471 |         "bar"
     1215|       "bar"
    14721216Expected:
    14731217| <!DOCTYPE html>
     
    149112357
    149212368
    1493 9
    14941237
    14951238Test 1 of 9 in resources/tests11.dat failed. Input:
     
    15001243|   <head>
    15011244|   <body>
    1502 |     <svg>
     1245|     <svg svg>
    15031246|       attributename=""
    15041247|       attributetype=""
     
    16391382|   <head>
    16401383|   <body>
    1641 |     <svg>
     1384|     <svg svg>
    16421385|       attributename=""
    16431386|       attributetype=""
     
    17781521|   <head>
    17791522|   <body>
    1780 |     <svg>
     1523|     <svg svg>
    17811524|       attributename=""
    17821525|       attributetype=""
     
    20561799|   <head>
    20571800|   <body>
    2058 |     <svg>
    2059 |       <altglyph>
    2060 |         <altglyphdef>
    2061 |           <altglyphitem>
    2062 |             <animatecolor>
    2063 |               <animatemotion>
    2064 |                 <animatetransform>
    2065 |                   <clippath>
    2066 |                     <feblend>
    2067 |                       <fecolormatrix>
    2068 |                         <fecomponenttransfer>
    2069 |                           <fecomposite>
    2070 |                             <feconvolvematrix>
    2071 |                               <fediffuselighting>
    2072 |                                 <fedisplacementmap>
    2073 |                                   <fedistantlight>
    2074 |                                     <feflood>
    2075 |                                       <fefunca>
    2076 |                                         <fefuncb>
    2077 |                                           <fefuncg>
    2078 |                                             <fefuncr>
    2079 |                                               <fegaussianblur>
    2080 |                                                 <feimage>
    2081 |                                                   <femerge>
    2082 |                                                     <femergenode>
    2083 |                                                       <femorphology>
    2084 |                                                         <feoffset>
    2085 |                                                           <fepointlight>
    2086 |                                                             <fespecularlighting>
    2087 |                                                               <fespotlight>
    2088 |                                                                 <fetile>
    2089 |                                                                   <feturbulence>
    2090 |                                                                     <foreignobject>
    2091 |                                                                       <glyphref>
    2092 |                                                                         <lineargradient>
    2093 |                                                                           <radialgradient>
    2094 |                                                                             <textpath>
     1801|     <svg svg>
     1802|       <svg altglyph>
     1803|       <svg altglyphdef>
     1804|       <svg altglyphitem>
     1805|       <svg animatecolor>
     1806|       <svg animatemotion>
     1807|       <svg animatetransform>
     1808|       <svg clippath>
     1809|       <svg feblend>
     1810|       <svg fecolormatrix>
     1811|       <svg fecomponenttransfer>
     1812|       <svg fecomposite>
     1813|       <svg feconvolvematrix>
     1814|       <svg fediffuselighting>
     1815|       <svg fedisplacementmap>
     1816|       <svg fedistantlight>
     1817|       <svg feflood>
     1818|       <svg fefunca>
     1819|       <svg fefuncb>
     1820|       <svg fefuncg>
     1821|       <svg fefuncr>
     1822|       <svg fegaussianblur>
     1823|       <svg feimage>
     1824|       <svg femerge>
     1825|       <svg femergenode>
     1826|       <svg femorphology>
     1827|       <svg feoffset>
     1828|       <svg fepointlight>
     1829|       <svg fespecularlighting>
     1830|       <svg fespotlight>
     1831|       <svg fetile>
     1832|       <svg feturbulence>
     1833|       <svg foreignobject>
     1834|       <svg glyphref>
     1835|       <svg lineargradient>
     1836|       <svg radialgradient>
     1837|       <svg textpath>
    20951838Expected:
    20961839| <!DOCTYPE html>
     
    21431886|   <head>
    21441887|   <body>
    2145 |     <svg>
    2146 |       <altglyph>
    2147 |         <altglyphdef>
    2148 |           <altglyphitem>
    2149 |             <animatecolor>
    2150 |               <animatemotion>
    2151 |                 <animatetransform>
    2152 |                   <clippath>
    2153 |                     <feblend>
    2154 |                       <fecolormatrix>
    2155 |                         <fecomponenttransfer>
    2156 |                           <fecomposite>
    2157 |                             <feconvolvematrix>
    2158 |                               <fediffuselighting>
    2159 |                                 <fedisplacementmap>
    2160 |                                   <fedistantlight>
    2161 |                                     <feflood>
    2162 |                                       <fefunca>
    2163 |                                         <fefuncb>
    2164 |                                           <fefuncg>
    2165 |                                             <fefuncr>
    2166 |                                               <fegaussianblur>
    2167 |                                                 <feimage>
    2168 |                                                   <femerge>
    2169 |                                                     <femergenode>
    2170 |                                                       <femorphology>
    2171 |                                                         <feoffset>
    2172 |                                                           <fepointlight>
    2173 |                                                             <fespecularlighting>
    2174 |                                                               <fespotlight>
    2175 |                                                                 <fetile>
    2176 |                                                                   <feturbulence>
    2177 |                                                                     <foreignobject>
    2178 |                                                                       <glyphref>
    2179 |                                                                         <lineargradient>
    2180 |                                                                           <radialgradient>
    2181 |                                                                             <textpath>
     1888|     <svg svg>
     1889|       <svg altglyph>
     1890|       <svg altglyphdef>
     1891|       <svg altglyphitem>
     1892|       <svg animatecolor>
     1893|       <svg animatemotion>
     1894|       <svg animatetransform>
     1895|       <svg clippath>
     1896|       <svg feblend>
     1897|       <svg fecolormatrix>
     1898|       <svg fecomponenttransfer>
     1899|       <svg fecomposite>
     1900|       <svg feconvolvematrix>
     1901|       <svg fediffuselighting>
     1902|       <svg fedisplacementmap>
     1903|       <svg fedistantlight>
     1904|       <svg feflood>
     1905|       <svg fefunca>
     1906|       <svg fefuncb>
     1907|       <svg fefuncg>
     1908|       <svg fefuncr>
     1909|       <svg fegaussianblur>
     1910|       <svg feimage>
     1911|       <svg femerge>
     1912|       <svg femergenode>
     1913|       <svg femorphology>
     1914|       <svg feoffset>
     1915|       <svg fepointlight>
     1916|       <svg fespecularlighting>
     1917|       <svg fespotlight>
     1918|       <svg fetile>
     1919|       <svg feturbulence>
     1920|       <svg foreignobject>
     1921|       <svg glyphref>
     1922|       <svg lineargradient>
     1923|       <svg radialgradient>
     1924|       <svg textpath>
    21821925Expected:
    21831926| <!DOCTYPE html>
     
    22301973|   <head>
    22311974|   <body>
    2232 |     <svg>
    2233 |       <altglyph>
    2234 |         <altglyphdef>
    2235 |           <altglyphitem>
    2236 |             <animatecolor>
    2237 |               <animatemotion>
    2238 |                 <animatetransform>
    2239 |                   <clippath>
    2240 |                     <feblend>
    2241 |                       <fecolormatrix>
    2242 |                         <fecomponenttransfer>
    2243 |                           <fecomposite>
    2244 |                             <feconvolvematrix>
    2245 |                               <fediffuselighting>
    2246 |                                 <fedisplacementmap>
    2247 |                                   <fedistantlight>
    2248 |                                     <feflood>
    2249 |                                       <fefunca>
    2250 |                                         <fefuncb>
    2251 |                                           <fefuncg>
    2252 |                                             <fefuncr>
    2253 |                                               <fegaussianblur>
    2254 |                                                 <feimage>
    2255 |                                                   <femerge>
    2256 |                                                     <femergenode>
    2257 |                                                       <femorphology>
    2258 |                                                         <feoffset>
    2259 |                                                           <fepointlight>
    2260 |                                                             <fespecularlighting>
    2261 |                                                               <fespotlight>
    2262 |                                                                 <fetile>
    2263 |                                                                   <feturbulence>
    2264 |                                                                     <foreignobject>
    2265 |                                                                       <glyphref>
    2266 |                                                                         <lineargradient>
    2267 |                                                                           <radialgradient>
    2268 |                                                                             <textpath>
     1975|     <svg svg>
     1976|       <svg altglyph>
     1977|       <svg altglyphdef>
     1978|       <svg altglyphitem>
     1979|       <svg animatecolor>
     1980|       <svg animatemotion>
     1981|       <svg animatetransform>
     1982|       <svg clippath>
     1983|       <svg feblend>
     1984|       <svg fecolormatrix>
     1985|       <svg fecomponenttransfer>
     1986|       <svg fecomposite>
     1987|       <svg feconvolvematrix>
     1988|       <svg fediffuselighting>
     1989|       <svg fedisplacementmap>
     1990|       <svg fedistantlight>
     1991|       <svg feflood>
     1992|       <svg fefunca>
     1993|       <svg fefuncb>
     1994|       <svg fefuncg>
     1995|       <svg fefuncr>
     1996|       <svg fegaussianblur>
     1997|       <svg feimage>
     1998|       <svg femerge>
     1999|       <svg femergenode>
     2000|       <svg femorphology>
     2001|       <svg feoffset>
     2002|       <svg fepointlight>
     2003|       <svg fespecularlighting>
     2004|       <svg fespotlight>
     2005|       <svg fetile>
     2006|       <svg feturbulence>
     2007|       <svg foreignobject>
     2008|       <svg glyphref>
     2009|       <svg lineargradient>
     2010|       <svg radialgradient>
     2011|       <svg textpath>
    22692012Expected:
    22702013| <!DOCTYPE html>
     
    23962139|       <math radialgradient>
    23972140|       <math textpath>
    2398 
    2399 Test 9 of 9 in resources/tests11.dat failed. Input:
    2400 <!DOCTYPE html><body><svg><solidColor /></svg>
    2401 Got:
    2402 | <!DOCTYPE html>
    2403 | <html>
    2404 |   <head>
    2405 |   <body>
    2406 |     <svg>
    2407 |       <solidcolor>
    2408 Expected:
    2409 | <!DOCTYPE html>
    2410 | <html>
    2411 |   <head>
    2412 |   <body>
    2413 |     <svg svg>
    2414 |       <svg solidcolor>
    24152141resources/tests12.dat:
    241621421
     
    24312157|             "baz"
    24322158|         <annotation-xml>
    2433 |           <svg>
    2434 |             <desc>
    2435 |               <b>
     2159|           <svg svg>
     2160|             <svg desc>
     2161|               <svg b>
    24362162|                 "eggs"
    2437 |             <g>
    2438 |               <foreignobject>
    2439 |     <p>
    2440 |       "spam"
    2441 |     <table>
    2442 |       <tbody>
    2443 |         <tr>
    2444 |           <td>
    2445 |             <img>
    2446 |     <g>
    2447 |       "quux"
    2448 |     "bar"
     2163|             <svg g>
     2164|               <svg foreignobject>
     2165|                 <svg p>
     2166|                   "spam"
     2167|                   <svg table>
     2168|                     <svg tr>
     2169|                       <svg td>
     2170|                         <svg img>
     2171|                           <svg g>
     2172|                             "quux"
     2173|                           "bar"
    24492174Expected:
    24502175| <!DOCTYPE html>
     
    24892214|           "baz"
    24902215|       <annotation-xml>
    2491 |         <svg>
    2492 |           <desc>
    2493 |             <b>
     2216|         <svg svg>
     2217|           <svg desc>
     2218|             <svg b>
    24942219|               "eggs"
    2495 |           <g>
    2496 |             <foreignobject>
    2497 |               <p>
     2220|           <svg g>
     2221|             <svg foreignobject>
     2222|               <svg p>
    24982223|                 "spam"
    2499 |               <table>
    2500 |                 <tbody>
    2501 |                   <tr>
    2502 |                     <td>
    2503 |                       <img>
    2504 |           <g>
    2505 |             "quux"
    2506 |     "bar"
     2224|                 <svg table>
     2225|                   <svg tr>
     2226|                     <svg td>
     2227|                       <svg img>
     2228|                         <svg g>
     2229|                           "quux"
     2230|                         "bar"
    25072231Expected:
    25082232| <!DOCTYPE html>
  • trunk/WebCore/ChangeLog

    r62924 r62926  
     12010-07-09  Eric Seidel  <eric@webkit.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        Implement self closing start tag state in the tokenizer
     6        https://bugs.webkit.org/show_bug.cgi?id=41946
     7
     8        Amazingly we got this far w/o needing self closing.
     9        The LegacyHTMLTreeBuilder clearly uses the self-closing
     10        state, but the fact that we never exposed it seems to
     11        not have caused any test failures.  Sad.
     12
     13        The new HTMLTreeBuilder only needs the self closing state
     14        for foreign content mode (and a few parse error cases).
     15
     16        * html/HTMLToken.h:
     17        (WebCore::HTMLToken::setSelfClosing):
     18        * html/HTMLTokenizer.cpp:
     19        (WebCore::HTMLTokenizer::nextToken):
     20        * html/HTMLTreeBuilder.cpp:
     21        (WebCore::):
     22
     232010-07-09  Eric Seidel  <eric@webkit.org>
     24
     25        Reviewed by Adam Barth.
     26
     27        Add basic "in foreign content" support to the TreeBuilder
     28        https://bugs.webkit.org/show_bug.cgi?id=41943
     29
     30        This is covered by numerous tests in html5lib/runner.html.
     31
     32        "in foreign content" mode requires us to be able to process
     33        tokens using the "secondary insertion mode".  We have to set
     34        a fake insertion mode to do that, so much of this code is enabling
     35        setting of fake insertion modes, and then later restoration of the
     36        insertion mode after execution.
     37
     38        There is a lot more of foreign content mode to implement, but this is
     39        a good start resulting in huge test progressions.
     40
     41        * html/HTMLConstructionSite.cpp:
     42        (WebCore::HTMLConstructionSite::insertSelfClosingHTMLElement):
     43         - Use createHTMLElementAndAttachToCurrent instead of copy/paste code.
     44         - No need to include HTMLElementFactory in this file.
     45        * html/HTMLConstructionSite.h:
     46         - RedirectToFosterParentGuard does not need to be a friend class.
     47        * html/HTMLElementStack.cpp:
     48        (WebCore::HTMLElementStack::isOnlyHTMLElementsInScope):
     49        * html/HTMLElementStack.h:
     50        * html/HTMLTreeBuilder.cpp:
     51        (WebCore::HTMLTreeBuilder::processStartTagForInBody):
     52        (WebCore::):
     53        * html/HTMLTreeBuilder.h:
     54        (WebCore::HTMLTreeBuilder::setInsertionMode):
     55        (WebCore::HTMLTreeBuilder::isFakeInsertionMode):
     56        (WebCore::HTMLTreeBuilder::setFakeInsertionMode):
     57
    1582010-07-09  Adam Barth  <abarth@webkit.org>
    259
  • trunk/WebCore/html/HTMLConstructionSite.cpp

    r62924 r62926  
    3333#include "Frame.h"
    3434#include "HTMLDocument.h"
    35 #include "HTMLElementFactory.h"
    3635#include "HTMLHtmlElement.h"
    3736#include "HTMLNames.h"
     
    216215{
    217216    ASSERT(token.type() == HTMLToken::StartTag);
    218     attach(currentElement(), createHTMLElement(token));
     217    createHTMLElementAndAttachToCurrent(token);
    219218    // FIXME: Do we want to acknowledge the token's self-closing flag?
    220219    // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#acknowledge-self-closing-flag
  • trunk/WebCore/html/HTMLConstructionSite.h

    r62924 r62926  
    107107
    108108private:
    109     friend class RedirectToFosterParentGuard;
    110 
    111109    struct AttachmentSite {
    112110        Node* parent;
  • trunk/WebCore/html/HTMLElementStack.cpp

    r62909 r62926  
    334334}
    335335
     336bool HTMLElementStack::hasOnlyHTMLElementsInScope() const
     337{
     338    for (ElementRecord* record = m_top.get(); record; record = record->next()) {
     339        Element* element = record->element();
     340        if (element->namespaceURI() != xhtmlNamespaceURI)
     341            return false;
     342        if (isScopeMarker(element))
     343            return true;
     344    }
     345    ASSERT_NOT_REACHED(); // <html> is always on the stack and is a scope marker.
     346    return true;
     347}
     348
    336349bool HTMLElementStack::inScope(Element* targetElement) const
    337350{
  • trunk/WebCore/html/HTMLElementStack.h

    r62909 r62926  
    106106    bool inTableScope(const QualifiedName&) const;
    107107
     108    bool hasOnlyHTMLElementsInScope() const;
     109
    108110    Element* htmlElement() const;
    109111    Element* headElement() const;
  • trunk/WebCore/html/HTMLToken.h

    r62551 r62926  
    175175    }
    176176
     177    void setSelfClosing()
     178    {
     179        ASSERT(m_type == HTMLToken::StartTag || m_type == HTMLToken::EndTag);
     180        m_selfClosing = true;
     181    }
     182
    177183    const AttributeList& attributes() const
    178184    {
  • trunk/WebCore/html/HTMLTokenizer.cpp

    r62378 r62926  
    10461046    BEGIN_STATE(SelfClosingStartTagState) {
    10471047        if (cc == '>') {
    1048             notImplemented();
     1048            m_token->setSelfClosing();
    10491049            return emitAndResumeIn(source, DataState);
    10501050        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
  • trunk/WebCore/html/HTMLTreeBuilder.cpp

    r62919 r62926  
    656656}
    657657
     658namespace {
     659
     660#if ENABLE(SVG)
     661void adjustSVGAttributes(AtomicHTMLToken&)
     662{
     663    notImplemented();
     664}
     665#endif
     666
     667#if ENABLE(MATHML)
     668void adjustMathMLAttributes(AtomicHTMLToken&)
     669{
     670    notImplemented();
     671}
     672#endif
     673
     674void adjustForeignAttributes(AtomicHTMLToken&)
     675{
     676    notImplemented();
     677}
     678
     679}
     680
    658681void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
    659682{
     
    915938        return;
    916939    }
    917     if (token.name() == "math") {
    918         // This is the MathML foreign content branch point.
    919         notImplemented();
    920     }
    921     if (token.name() == "svg") {
    922         // This is the SVG foreign content branch point.
    923         notImplemented();
    924     }
     940    // FIXME: These should not need #if guards.
     941#if ENABLE(MATHML)
     942    if (token.name() == MathMLNames::mathTag.localName()) {
     943        m_tree.reconstructTheActiveFormattingElements();
     944        adjustMathMLAttributes(token);
     945        adjustForeignAttributes(token);
     946        m_tree.insertForeignElement(token, MathMLNames::mathMLNamespaceURI);
     947        if (m_insertionMode != InForeignContentMode) {
     948            setSecondaryInsertionMode(m_insertionMode));
     949            setInsertionMode(InForeignContentMode);
     950        }
     951        return;
     952    }
     953#endif
     954#if ENABLE(SVG)
     955    if (token.name() == SVGNames::svgTag.localName()) {
     956        m_tree.reconstructTheActiveFormattingElements();
     957        adjustSVGAttributes(token);
     958        adjustForeignAttributes(token);
     959        m_tree.insertForeignElement(token, SVGNames::svgNamespaceURI);
     960        if (m_insertionMode != InForeignContentMode) {
     961            setSecondaryInsertionMode(m_insertionMode);
     962            setInsertionMode(InForeignContentMode);
     963        }
     964        return;
     965    }
     966#endif
    925967    if (isCaptionColOrColgroupTag(token.name())
    926968        || token.name() == frameTag
     
    13441386        processStartTag(token);
    13451387        break;
     1388    case InForeignContentMode: {
     1389        // FIXME: We're missing a bunch of if branches here.
     1390        notImplemented();
     1391        const AtomicString& currentNamespace = m_tree.currentElement()->namespaceURI();
     1392#if ENABLE(MATHML)
     1393        if (currentNamespace == MathMLNames::mathMLNamespaceURI)
     1394            adjustMathMLAttributes(token);
     1395#endif
     1396#if ENABLE(SVG)
     1397         if (currentNamespace == SVGNames::svgNamespaceURI)
     1398            adjustSVGAttributes(token);
     1399#endif
     1400        adjustForeignAttributes(token);
     1401        m_tree.insertForeignElement(token, currentNamespace);
     1402        break;
     1403    }
    13461404    case TextMode:
    1347     case InForeignContentMode:
    13481405        notImplemented();
    13491406        break;
     
    15221579}
    15231580
     1581void HTMLTreeBuilder::setSecondaryInsertionMode(InsertionMode mode)
     1582{
     1583    ASSERT(mode != InForeignContentMode);
     1584    m_secondaryInsertionMode = mode;
     1585}
     1586
    15241587void HTMLTreeBuilder::setInsertionModeAndEnd(InsertionMode newInsertionMode, bool foreign)
    15251588{
    15261589    setInsertionMode(newInsertionMode);
    15271590    if (foreign) {
    1528         m_secondaryInsertionMode = m_insertionMode;
     1591        setSecondaryInsertionMode(m_insertionMode);
    15291592        setInsertionMode(InForeignContentMode);
    15301593    }
     
    21282191        break;
    21292192    case InForeignContentMode:
    2130         notImplemented();
    2131         break;
    2132     }
     2193#if ENABLE(SVG)
     2194        if (token.name() == SVGNames::scriptTag && m_tree.currentElement()->hasTagName(SVGNames::scriptTag)) {
     2195            notImplemented();
     2196            return;
     2197        }
     2198#endif
     2199        if (m_tree.currentElement()->namespaceURI() != xhtmlNamespaceURI) {
     2200            // FIXME: This code just wants an Element* iterator, instead of an ElementRecord*
     2201            HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord();
     2202            if (!nodeRecord->element()->hasLocalName(token.name())) {
     2203                parseError(token);
     2204                // FIXME: This return is not in the spec but appears to be needed.
     2205                // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10118
     2206                return;
     2207            }
     2208            while (1) {
     2209                if (nodeRecord->element()->hasLocalName(token.name())) {
     2210                    m_tree.openElements()->popUntilPopped(nodeRecord->element());
     2211                    return;
     2212                }
     2213                nodeRecord = nodeRecord->next();
     2214                if (nodeRecord->element()->namespaceURI() == xhtmlNamespaceURI)
     2215                    processEndTagUsingSecondaryInsertionModeAndAdjustInsertionMode(token);
     2216            }
     2217            return;
     2218        }
     2219        processEndTagUsingSecondaryInsertionModeAndAdjustInsertionMode(token);
     2220        break;
     2221    }
     2222}
     2223
     2224class HTMLTreeBuilder::FakeInsertionMode : public Noncopyable {
     2225public:
     2226    FakeInsertionMode(HTMLTreeBuilder* treeBuilder, InsertionMode mode)
     2227        : m_treeBuilder(treeBuilder)
     2228        , m_originalMode(treeBuilder->insertionMode())
     2229    {
     2230        m_treeBuilder->setFakeInsertionMode(mode);
     2231    }
     2232
     2233    ~FakeInsertionMode()
     2234    {
     2235        if (m_treeBuilder->isFakeInsertionMode())
     2236            m_treeBuilder->setInsertionMode(m_originalMode);
     2237    }
     2238
     2239private:
     2240    HTMLTreeBuilder* m_treeBuilder;
     2241    InsertionMode m_originalMode;
     2242};
     2243
     2244// This handles both secondary insertion mode processing, as well as updating
     2245// the insertion mode.  These are separate steps in the spec, but always occur
     2246// right after one another.
     2247void HTMLTreeBuilder::processEndTagUsingSecondaryInsertionModeAndAdjustInsertionMode(AtomicHTMLToken& token)
     2248{
     2249    {
     2250        FakeInsertionMode fakeMode(this, m_secondaryInsertionMode);
     2251        processEndTag(token);
     2252    }
     2253    if (insertionMode() == InForeignContentMode && m_tree.openElements()->hasOnlyHTMLElementsInScope())
     2254        setInsertionMode(m_secondaryInsertionMode);
    21332255}
    21342256
     
    22892411    }
    22902412    case InForeignContentMode: {
    2291         notImplemented();
     2413        ASSERT(insertionMode() == InForeignContentMode);
     2414        String characters = buffer.takeRemaining();
     2415        m_tree.insertTextNode(characters);
     2416        if (m_framesetOk && hasNonWhitespace(characters))
     2417            m_framesetOk = false;
    22922418        break;
    22932419    }
     
    23682494        processEndOfFile(token);
    23692495        break;
     2496    case InForeignContentMode:
     2497        parseError(token);
     2498        // FIXME: Following the spec would infinitely recurse on <svg><svg>
     2499        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10115
     2500        while (m_tree.currentElement()) {
     2501            if (m_tree.currentElement()->namespaceURI() == xhtmlNamespaceURI)
     2502                break;
     2503            m_tree.openElements()->pop();
     2504        }
     2505        setInsertionMode(m_secondaryInsertionMode);
     2506        processEndOfFile(token);
     2507        break;
    23702508    case InTableTextMode:
    23712509        processDefaultForInTableTextMode(token);
     
    23752513    case InCaptionMode:
    23762514    case InRowMode:
    2377     case InForeignContentMode:
    23782515        notImplemented();
    23792516        break;
  • trunk/WebCore/html/HTMLTreeBuilder.h

    r62919 r62926  
    7676
    7777private:
     78    class FakeInsertionMode;
    7879    // Represents HTML5 "insertion mode"
    7980    // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#insertion-mode
     
    153154    void processDefaultForInTableTextMode(AtomicHTMLToken&);
    154155
     156    void processEndTagUsingSecondaryInsertionModeAndAdjustInsertionMode(AtomicHTMLToken&);
     157
    155158    PassRefPtr<NamedNodeMap> attributesForIsindexInput(AtomicHTMLToken&);
    156159
     
    172175    void handleScriptEndTag(Element*, int scriptStartLine);
    173176
    174     void setInsertionMode(InsertionMode value) { m_insertionMode = value; }
    175177    InsertionMode insertionMode() const { return m_insertionMode; }
     178    void setInsertionMode(InsertionMode mode)
     179    {
     180        m_insertionMode = mode;
     181        m_isFakeInsertionMode = false;
     182    }
     183
     184    bool isFakeInsertionMode() { return m_isFakeInsertionMode; }
     185    void setFakeInsertionMode(InsertionMode mode)
     186    {
     187        m_insertionMode = mode;
     188        m_isFakeInsertionMode = true;
     189    }
     190
     191    void setSecondaryInsertionMode(InsertionMode);
    176192
    177193    void setInsertionModeAndEnd(InsertionMode, bool foreign); // Helper for resetInsertionModeAppropriately
     
    185201    bool m_reportErrors;
    186202    bool m_isPaused;
     203    bool m_isFakeInsertionMode;
    187204
    188205    // FIXME: InsertionModes should be a separate object to prevent direct
Note: See TracChangeset for help on using the changeset viewer.