OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. |
3 * Copyright (C) 2011, 2014 Apple Inc. All rights reserved. | 3 * Copyright (C) 2011, 2014 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 ASSERT(!m_tree.isEmpty()); | 976 ASSERT(!m_tree.isEmpty()); |
977 if (isParsingFragment() && m_tree.openElements()->hasOnlyOneElement()) | 977 if (isParsingFragment() && m_tree.openElements()->hasOnlyOneElement()) |
978 return m_fragmentContext.contextElementStackItem(); | 978 return m_fragmentContext.contextElementStackItem(); |
979 | 979 |
980 return m_tree.currentStackItem(); | 980 return m_tree.currentStackItem(); |
981 } | 981 } |
982 | 982 |
983 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html
#close-the-cell | 983 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html
#close-the-cell |
984 void HTMLTreeBuilder::closeTheCell() | 984 void HTMLTreeBuilder::closeTheCell() |
985 { | 985 { |
986 ASSERT(insertionMode() == InCellMode); | 986 ASSERT(getInsertionMode() == InCellMode); |
987 if (m_tree.openElements()->inTableScope(tdTag)) { | 987 if (m_tree.openElements()->inTableScope(tdTag)) { |
988 ASSERT(!m_tree.openElements()->inTableScope(thTag)); | 988 ASSERT(!m_tree.openElements()->inTableScope(thTag)); |
989 processFakeEndTag(tdTag); | 989 processFakeEndTag(tdTag); |
990 return; | 990 return; |
991 } | 991 } |
992 ASSERT(m_tree.openElements()->inTableScope(thTag)); | 992 ASSERT(m_tree.openElements()->inTableScope(thTag)); |
993 processFakeEndTag(thTag); | 993 processFakeEndTag(thTag); |
994 ASSERT(insertionMode() == InRowMode); | 994 ASSERT(getInsertionMode() == InRowMode); |
995 } | 995 } |
996 | 996 |
997 void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken* token) | 997 void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken* token) |
998 { | 998 { |
999 ASSERT(token->type() == HTMLToken::StartTag); | 999 ASSERT(token->type() == HTMLToken::StartTag); |
1000 if (token->name() == captionTag) { | 1000 if (token->name() == captionTag) { |
1001 m_tree.openElements()->popUntilTableScopeMarker(); | 1001 m_tree.openElements()->popUntilTableScopeMarker(); |
1002 m_tree.activeFormattingElements()->appendMarker(); | 1002 m_tree.activeFormattingElements()->appendMarker(); |
1003 m_tree.insertHTMLElement(token); | 1003 m_tree.insertHTMLElement(token); |
1004 setInsertionMode(InCaptionMode); | 1004 setInsertionMode(InCaptionMode); |
(...skipping 13 matching lines...) Expand all Loading... |
1018 } | 1018 } |
1019 if (isTableBodyContextTag(token->name())) { | 1019 if (isTableBodyContextTag(token->name())) { |
1020 m_tree.openElements()->popUntilTableScopeMarker(); | 1020 m_tree.openElements()->popUntilTableScopeMarker(); |
1021 m_tree.insertHTMLElement(token); | 1021 m_tree.insertHTMLElement(token); |
1022 setInsertionMode(InTableBodyMode); | 1022 setInsertionMode(InTableBodyMode); |
1023 return; | 1023 return; |
1024 } | 1024 } |
1025 if (isTableCellContextTag(token->name()) | 1025 if (isTableCellContextTag(token->name()) |
1026 || token->name() == trTag) { | 1026 || token->name() == trTag) { |
1027 processFakeStartTag(tbodyTag); | 1027 processFakeStartTag(tbodyTag); |
1028 ASSERT(insertionMode() == InTableBodyMode); | 1028 ASSERT(getInsertionMode() == InTableBodyMode); |
1029 processStartTag(token); | 1029 processStartTag(token); |
1030 return; | 1030 return; |
1031 } | 1031 } |
1032 if (token->name() == tableTag) { | 1032 if (token->name() == tableTag) { |
1033 parseError(token); | 1033 parseError(token); |
1034 if (!processTableEndTagForInTable()) { | 1034 if (!processTableEndTagForInTable()) { |
1035 ASSERT(isParsingFragmentOrTemplateContents()); | 1035 ASSERT(isParsingFragmentOrTemplateContents()); |
1036 return; | 1036 return; |
1037 } | 1037 } |
1038 processStartTag(token); | 1038 processStartTag(token); |
(...skipping 25 matching lines...) Expand all Loading... |
1064 return; | 1064 return; |
1065 } | 1065 } |
1066 parseError(token); | 1066 parseError(token); |
1067 HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree); | 1067 HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree); |
1068 processStartTagForInBody(token); | 1068 processStartTagForInBody(token); |
1069 } | 1069 } |
1070 | 1070 |
1071 void HTMLTreeBuilder::processStartTag(AtomicHTMLToken* token) | 1071 void HTMLTreeBuilder::processStartTag(AtomicHTMLToken* token) |
1072 { | 1072 { |
1073 ASSERT(token->type() == HTMLToken::StartTag); | 1073 ASSERT(token->type() == HTMLToken::StartTag); |
1074 switch (insertionMode()) { | 1074 switch (getInsertionMode()) { |
1075 case InitialMode: | 1075 case InitialMode: |
1076 ASSERT(insertionMode() == InitialMode); | 1076 ASSERT(getInsertionMode() == InitialMode); |
1077 defaultForInitial(); | 1077 defaultForInitial(); |
1078 // Fall through. | 1078 // Fall through. |
1079 case BeforeHTMLMode: | 1079 case BeforeHTMLMode: |
1080 ASSERT(insertionMode() == BeforeHTMLMode); | 1080 ASSERT(getInsertionMode() == BeforeHTMLMode); |
1081 if (token->name() == htmlTag) { | 1081 if (token->name() == htmlTag) { |
1082 m_tree.insertHTMLHtmlStartTagBeforeHTML(token); | 1082 m_tree.insertHTMLHtmlStartTagBeforeHTML(token); |
1083 setInsertionMode(BeforeHeadMode); | 1083 setInsertionMode(BeforeHeadMode); |
1084 return; | 1084 return; |
1085 } | 1085 } |
1086 defaultForBeforeHTML(); | 1086 defaultForBeforeHTML(); |
1087 // Fall through. | 1087 // Fall through. |
1088 case BeforeHeadMode: | 1088 case BeforeHeadMode: |
1089 ASSERT(insertionMode() == BeforeHeadMode); | 1089 ASSERT(getInsertionMode() == BeforeHeadMode); |
1090 if (token->name() == htmlTag) { | 1090 if (token->name() == htmlTag) { |
1091 processHtmlStartTagForInBody(token); | 1091 processHtmlStartTagForInBody(token); |
1092 return; | 1092 return; |
1093 } | 1093 } |
1094 if (token->name() == headTag) { | 1094 if (token->name() == headTag) { |
1095 m_tree.insertHTMLHeadElement(token); | 1095 m_tree.insertHTMLHeadElement(token); |
1096 setInsertionMode(InHeadMode); | 1096 setInsertionMode(InHeadMode); |
1097 return; | 1097 return; |
1098 } | 1098 } |
1099 defaultForBeforeHead(); | 1099 defaultForBeforeHead(); |
1100 // Fall through. | 1100 // Fall through. |
1101 case InHeadMode: | 1101 case InHeadMode: |
1102 ASSERT(insertionMode() == InHeadMode); | 1102 ASSERT(getInsertionMode() == InHeadMode); |
1103 if (processStartTagForInHead(token)) | 1103 if (processStartTagForInHead(token)) |
1104 return; | 1104 return; |
1105 defaultForInHead(); | 1105 defaultForInHead(); |
1106 // Fall through. | 1106 // Fall through. |
1107 case AfterHeadMode: | 1107 case AfterHeadMode: |
1108 ASSERT(insertionMode() == AfterHeadMode); | 1108 ASSERT(getInsertionMode() == AfterHeadMode); |
1109 if (token->name() == htmlTag) { | 1109 if (token->name() == htmlTag) { |
1110 processHtmlStartTagForInBody(token); | 1110 processHtmlStartTagForInBody(token); |
1111 return; | 1111 return; |
1112 } | 1112 } |
1113 if (token->name() == bodyTag) { | 1113 if (token->name() == bodyTag) { |
1114 m_framesetOk = false; | 1114 m_framesetOk = false; |
1115 m_tree.insertHTMLBodyElement(token); | 1115 m_tree.insertHTMLBodyElement(token); |
1116 setInsertionMode(InBodyMode); | 1116 setInsertionMode(InBodyMode); |
1117 return; | 1117 return; |
1118 } | 1118 } |
(...skipping 19 matching lines...) Expand all Loading... |
1138 m_tree.openElements()->removeHTMLHeadElement(m_tree.head()); | 1138 m_tree.openElements()->removeHTMLHeadElement(m_tree.head()); |
1139 return; | 1139 return; |
1140 } | 1140 } |
1141 if (token->name() == headTag) { | 1141 if (token->name() == headTag) { |
1142 parseError(token); | 1142 parseError(token); |
1143 return; | 1143 return; |
1144 } | 1144 } |
1145 defaultForAfterHead(); | 1145 defaultForAfterHead(); |
1146 // Fall through | 1146 // Fall through |
1147 case InBodyMode: | 1147 case InBodyMode: |
1148 ASSERT(insertionMode() == InBodyMode); | 1148 ASSERT(getInsertionMode() == InBodyMode); |
1149 processStartTagForInBody(token); | 1149 processStartTagForInBody(token); |
1150 break; | 1150 break; |
1151 case InTableMode: | 1151 case InTableMode: |
1152 ASSERT(insertionMode() == InTableMode); | 1152 ASSERT(getInsertionMode() == InTableMode); |
1153 processStartTagForInTable(token); | 1153 processStartTagForInTable(token); |
1154 break; | 1154 break; |
1155 case InCaptionMode: | 1155 case InCaptionMode: |
1156 ASSERT(insertionMode() == InCaptionMode); | 1156 ASSERT(getInsertionMode() == InCaptionMode); |
1157 if (isCaptionColOrColgroupTag(token->name()) | 1157 if (isCaptionColOrColgroupTag(token->name()) |
1158 || isTableBodyContextTag(token->name()) | 1158 || isTableBodyContextTag(token->name()) |
1159 || isTableCellContextTag(token->name()) | 1159 || isTableCellContextTag(token->name()) |
1160 || token->name() == trTag) { | 1160 || token->name() == trTag) { |
1161 parseError(token); | 1161 parseError(token); |
1162 if (!processCaptionEndTagForInCaption()) { | 1162 if (!processCaptionEndTagForInCaption()) { |
1163 ASSERT(isParsingFragment()); | 1163 ASSERT(isParsingFragment()); |
1164 return; | 1164 return; |
1165 } | 1165 } |
1166 processStartTag(token); | 1166 processStartTag(token); |
1167 return; | 1167 return; |
1168 } | 1168 } |
1169 processStartTagForInBody(token); | 1169 processStartTagForInBody(token); |
1170 break; | 1170 break; |
1171 case InColumnGroupMode: | 1171 case InColumnGroupMode: |
1172 ASSERT(insertionMode() == InColumnGroupMode); | 1172 ASSERT(getInsertionMode() == InColumnGroupMode); |
1173 if (token->name() == htmlTag) { | 1173 if (token->name() == htmlTag) { |
1174 processHtmlStartTagForInBody(token); | 1174 processHtmlStartTagForInBody(token); |
1175 return; | 1175 return; |
1176 } | 1176 } |
1177 if (token->name() == colTag) { | 1177 if (token->name() == colTag) { |
1178 m_tree.insertSelfClosingHTMLElementDestroyingToken(token); | 1178 m_tree.insertSelfClosingHTMLElementDestroyingToken(token); |
1179 return; | 1179 return; |
1180 } | 1180 } |
1181 if (token->name() == templateTag) { | 1181 if (token->name() == templateTag) { |
1182 processTemplateStartTag(token); | 1182 processTemplateStartTag(token); |
1183 return; | 1183 return; |
1184 } | 1184 } |
1185 if (!processColgroupEndTagForInColumnGroup()) { | 1185 if (!processColgroupEndTagForInColumnGroup()) { |
1186 ASSERT(isParsingFragmentOrTemplateContents()); | 1186 ASSERT(isParsingFragmentOrTemplateContents()); |
1187 return; | 1187 return; |
1188 } | 1188 } |
1189 processStartTag(token); | 1189 processStartTag(token); |
1190 break; | 1190 break; |
1191 case InTableBodyMode: | 1191 case InTableBodyMode: |
1192 ASSERT(insertionMode() == InTableBodyMode); | 1192 ASSERT(getInsertionMode() == InTableBodyMode); |
1193 if (token->name() == trTag) { | 1193 if (token->name() == trTag) { |
1194 m_tree.openElements()->popUntilTableBodyScopeMarker(); // How is the
re ever anything to pop? | 1194 m_tree.openElements()->popUntilTableBodyScopeMarker(); // How is the
re ever anything to pop? |
1195 m_tree.insertHTMLElement(token); | 1195 m_tree.insertHTMLElement(token); |
1196 setInsertionMode(InRowMode); | 1196 setInsertionMode(InRowMode); |
1197 return; | 1197 return; |
1198 } | 1198 } |
1199 if (isTableCellContextTag(token->name())) { | 1199 if (isTableCellContextTag(token->name())) { |
1200 parseError(token); | 1200 parseError(token); |
1201 processFakeStartTag(trTag); | 1201 processFakeStartTag(trTag); |
1202 ASSERT(insertionMode() == InRowMode); | 1202 ASSERT(getInsertionMode() == InRowMode); |
1203 processStartTag(token); | 1203 processStartTag(token); |
1204 return; | 1204 return; |
1205 } | 1205 } |
1206 if (isCaptionColOrColgroupTag(token->name()) || isTableBodyContextTag(to
ken->name())) { | 1206 if (isCaptionColOrColgroupTag(token->name()) || isTableBodyContextTag(to
ken->name())) { |
1207 // FIXME: This is slow. | 1207 // FIXME: This is slow. |
1208 if (!m_tree.openElements()->inTableScope(tbodyTag) && !m_tree.openEl
ements()->inTableScope(theadTag) && !m_tree.openElements()->inTableScope(tfootTa
g)) { | 1208 if (!m_tree.openElements()->inTableScope(tbodyTag) && !m_tree.openEl
ements()->inTableScope(theadTag) && !m_tree.openElements()->inTableScope(tfootTa
g)) { |
1209 ASSERT(isParsingFragmentOrTemplateContents()); | 1209 ASSERT(isParsingFragmentOrTemplateContents()); |
1210 parseError(token); | 1210 parseError(token); |
1211 return; | 1211 return; |
1212 } | 1212 } |
1213 m_tree.openElements()->popUntilTableBodyScopeMarker(); | 1213 m_tree.openElements()->popUntilTableBodyScopeMarker(); |
1214 ASSERT(isTableBodyContextTag(m_tree.currentStackItem()->localName())
); | 1214 ASSERT(isTableBodyContextTag(m_tree.currentStackItem()->localName())
); |
1215 processFakeEndTag(m_tree.currentStackItem()->localName()); | 1215 processFakeEndTag(m_tree.currentStackItem()->localName()); |
1216 processStartTag(token); | 1216 processStartTag(token); |
1217 return; | 1217 return; |
1218 } | 1218 } |
1219 processStartTagForInTable(token); | 1219 processStartTagForInTable(token); |
1220 break; | 1220 break; |
1221 case InRowMode: | 1221 case InRowMode: |
1222 ASSERT(insertionMode() == InRowMode); | 1222 ASSERT(getInsertionMode() == InRowMode); |
1223 if (isTableCellContextTag(token->name())) { | 1223 if (isTableCellContextTag(token->name())) { |
1224 m_tree.openElements()->popUntilTableRowScopeMarker(); | 1224 m_tree.openElements()->popUntilTableRowScopeMarker(); |
1225 m_tree.insertHTMLElement(token); | 1225 m_tree.insertHTMLElement(token); |
1226 setInsertionMode(InCellMode); | 1226 setInsertionMode(InCellMode); |
1227 m_tree.activeFormattingElements()->appendMarker(); | 1227 m_tree.activeFormattingElements()->appendMarker(); |
1228 return; | 1228 return; |
1229 } | 1229 } |
1230 if (token->name() == trTag | 1230 if (token->name() == trTag |
1231 || isCaptionColOrColgroupTag(token->name()) | 1231 || isCaptionColOrColgroupTag(token->name()) |
1232 || isTableBodyContextTag(token->name())) { | 1232 || isTableBodyContextTag(token->name())) { |
1233 if (!processTrEndTagForInRow()) { | 1233 if (!processTrEndTagForInRow()) { |
1234 ASSERT(isParsingFragmentOrTemplateContents()); | 1234 ASSERT(isParsingFragmentOrTemplateContents()); |
1235 return; | 1235 return; |
1236 } | 1236 } |
1237 ASSERT(insertionMode() == InTableBodyMode); | 1237 ASSERT(getInsertionMode() == InTableBodyMode); |
1238 processStartTag(token); | 1238 processStartTag(token); |
1239 return; | 1239 return; |
1240 } | 1240 } |
1241 processStartTagForInTable(token); | 1241 processStartTagForInTable(token); |
1242 break; | 1242 break; |
1243 case InCellMode: | 1243 case InCellMode: |
1244 ASSERT(insertionMode() == InCellMode); | 1244 ASSERT(getInsertionMode() == InCellMode); |
1245 if (isCaptionColOrColgroupTag(token->name()) | 1245 if (isCaptionColOrColgroupTag(token->name()) |
1246 || isTableCellContextTag(token->name()) | 1246 || isTableCellContextTag(token->name()) |
1247 || token->name() == trTag | 1247 || token->name() == trTag |
1248 || isTableBodyContextTag(token->name())) { | 1248 || isTableBodyContextTag(token->name())) { |
1249 // FIXME: This could be more efficient. | 1249 // FIXME: This could be more efficient. |
1250 if (!m_tree.openElements()->inTableScope(tdTag) && !m_tree.openEleme
nts()->inTableScope(thTag)) { | 1250 if (!m_tree.openElements()->inTableScope(tdTag) && !m_tree.openEleme
nts()->inTableScope(thTag)) { |
1251 ASSERT(isParsingFragment()); | 1251 ASSERT(isParsingFragment()); |
1252 parseError(token); | 1252 parseError(token); |
1253 return; | 1253 return; |
1254 } | 1254 } |
1255 closeTheCell(); | 1255 closeTheCell(); |
1256 processStartTag(token); | 1256 processStartTag(token); |
1257 return; | 1257 return; |
1258 } | 1258 } |
1259 processStartTagForInBody(token); | 1259 processStartTagForInBody(token); |
1260 break; | 1260 break; |
1261 case AfterBodyMode: | 1261 case AfterBodyMode: |
1262 case AfterAfterBodyMode: | 1262 case AfterAfterBodyMode: |
1263 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfter
BodyMode); | 1263 ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == Afte
rAfterBodyMode); |
1264 if (token->name() == htmlTag) { | 1264 if (token->name() == htmlTag) { |
1265 processHtmlStartTagForInBody(token); | 1265 processHtmlStartTagForInBody(token); |
1266 return; | 1266 return; |
1267 } | 1267 } |
1268 setInsertionMode(InBodyMode); | 1268 setInsertionMode(InBodyMode); |
1269 processStartTag(token); | 1269 processStartTag(token); |
1270 break; | 1270 break; |
1271 case InHeadNoscriptMode: | 1271 case InHeadNoscriptMode: |
1272 ASSERT(insertionMode() == InHeadNoscriptMode); | 1272 ASSERT(getInsertionMode() == InHeadNoscriptMode); |
1273 if (token->name() == htmlTag) { | 1273 if (token->name() == htmlTag) { |
1274 processHtmlStartTagForInBody(token); | 1274 processHtmlStartTagForInBody(token); |
1275 return; | 1275 return; |
1276 } | 1276 } |
1277 if (token->name() == basefontTag | 1277 if (token->name() == basefontTag |
1278 || token->name() == bgsoundTag | 1278 || token->name() == bgsoundTag |
1279 || token->name() == linkTag | 1279 || token->name() == linkTag |
1280 || token->name() == metaTag | 1280 || token->name() == metaTag |
1281 || token->name() == noframesTag | 1281 || token->name() == noframesTag |
1282 || token->name() == styleTag) { | 1282 || token->name() == styleTag) { |
1283 bool didProcess = processStartTagForInHead(token); | 1283 bool didProcess = processStartTagForInHead(token); |
1284 ASSERT_UNUSED(didProcess, didProcess); | 1284 ASSERT_UNUSED(didProcess, didProcess); |
1285 return; | 1285 return; |
1286 } | 1286 } |
1287 if (token->name() == htmlTag || token->name() == noscriptTag) { | 1287 if (token->name() == htmlTag || token->name() == noscriptTag) { |
1288 parseError(token); | 1288 parseError(token); |
1289 return; | 1289 return; |
1290 } | 1290 } |
1291 defaultForInHeadNoscript(); | 1291 defaultForInHeadNoscript(); |
1292 processToken(token); | 1292 processToken(token); |
1293 break; | 1293 break; |
1294 case InFramesetMode: | 1294 case InFramesetMode: |
1295 ASSERT(insertionMode() == InFramesetMode); | 1295 ASSERT(getInsertionMode() == InFramesetMode); |
1296 if (token->name() == htmlTag) { | 1296 if (token->name() == htmlTag) { |
1297 processHtmlStartTagForInBody(token); | 1297 processHtmlStartTagForInBody(token); |
1298 return; | 1298 return; |
1299 } | 1299 } |
1300 if (token->name() == framesetTag) { | 1300 if (token->name() == framesetTag) { |
1301 m_tree.insertHTMLElement(token); | 1301 m_tree.insertHTMLElement(token); |
1302 return; | 1302 return; |
1303 } | 1303 } |
1304 if (token->name() == frameTag) { | 1304 if (token->name() == frameTag) { |
1305 m_tree.insertSelfClosingHTMLElementDestroyingToken(token); | 1305 m_tree.insertSelfClosingHTMLElementDestroyingToken(token); |
1306 return; | 1306 return; |
1307 } | 1307 } |
1308 if (token->name() == noframesTag) { | 1308 if (token->name() == noframesTag) { |
1309 processStartTagForInHead(token); | 1309 processStartTagForInHead(token); |
1310 return; | 1310 return; |
1311 } | 1311 } |
1312 if (token->name() == templateTag) { | 1312 if (token->name() == templateTag) { |
1313 processTemplateStartTag(token); | 1313 processTemplateStartTag(token); |
1314 return; | 1314 return; |
1315 } | 1315 } |
1316 parseError(token); | 1316 parseError(token); |
1317 break; | 1317 break; |
1318 case AfterFramesetMode: | 1318 case AfterFramesetMode: |
1319 case AfterAfterFramesetMode: | 1319 case AfterAfterFramesetMode: |
1320 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterA
fterFramesetMode); | 1320 ASSERT(getInsertionMode() == AfterFramesetMode || getInsertionMode() ==
AfterAfterFramesetMode); |
1321 if (token->name() == htmlTag) { | 1321 if (token->name() == htmlTag) { |
1322 processHtmlStartTagForInBody(token); | 1322 processHtmlStartTagForInBody(token); |
1323 return; | 1323 return; |
1324 } | 1324 } |
1325 if (token->name() == noframesTag) { | 1325 if (token->name() == noframesTag) { |
1326 processStartTagForInHead(token); | 1326 processStartTagForInHead(token); |
1327 return; | 1327 return; |
1328 } | 1328 } |
1329 parseError(token); | 1329 parseError(token); |
1330 break; | 1330 break; |
1331 case InSelectInTableMode: | 1331 case InSelectInTableMode: |
1332 ASSERT(insertionMode() == InSelectInTableMode); | 1332 ASSERT(getInsertionMode() == InSelectInTableMode); |
1333 if (token->name() == captionTag | 1333 if (token->name() == captionTag |
1334 || token->name() == tableTag | 1334 || token->name() == tableTag |
1335 || isTableBodyContextTag(token->name()) | 1335 || isTableBodyContextTag(token->name()) |
1336 || token->name() == trTag | 1336 || token->name() == trTag |
1337 || isTableCellContextTag(token->name())) { | 1337 || isTableCellContextTag(token->name())) { |
1338 parseError(token); | 1338 parseError(token); |
1339 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName()); | 1339 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName()); |
1340 processEndTag(&endSelect); | 1340 processEndTag(&endSelect); |
1341 processStartTag(token); | 1341 processStartTag(token); |
1342 return; | 1342 return; |
1343 } | 1343 } |
1344 // Fall through | 1344 // Fall through |
1345 case InSelectMode: | 1345 case InSelectMode: |
1346 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode); | 1346 ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSel
ectInTableMode); |
1347 if (token->name() == htmlTag) { | 1347 if (token->name() == htmlTag) { |
1348 processHtmlStartTagForInBody(token); | 1348 processHtmlStartTagForInBody(token); |
1349 return; | 1349 return; |
1350 } | 1350 } |
1351 if (token->name() == optionTag) { | 1351 if (token->name() == optionTag) { |
1352 if (m_tree.currentStackItem()->hasTagName(optionTag)) { | 1352 if (m_tree.currentStackItem()->hasTagName(optionTag)) { |
1353 AtomicHTMLToken endOption(HTMLToken::EndTag, optionTag.localName
()); | 1353 AtomicHTMLToken endOption(HTMLToken::EndTag, optionTag.localName
()); |
1354 processEndTag(&endOption); | 1354 processEndTag(&endOption); |
1355 } | 1355 } |
1356 m_tree.insertHTMLElement(token); | 1356 m_tree.insertHTMLElement(token); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 ASSERT(token->type() == HTMLToken::EndTag); | 1689 ASSERT(token->type() == HTMLToken::EndTag); |
1690 if (token->name() == trTag) { | 1690 if (token->name() == trTag) { |
1691 processTrEndTagForInRow(); | 1691 processTrEndTagForInRow(); |
1692 return; | 1692 return; |
1693 } | 1693 } |
1694 if (token->name() == tableTag) { | 1694 if (token->name() == tableTag) { |
1695 if (!processTrEndTagForInRow()) { | 1695 if (!processTrEndTagForInRow()) { |
1696 ASSERT(isParsingFragmentOrTemplateContents()); | 1696 ASSERT(isParsingFragmentOrTemplateContents()); |
1697 return; | 1697 return; |
1698 } | 1698 } |
1699 ASSERT(insertionMode() == InTableBodyMode); | 1699 ASSERT(getInsertionMode() == InTableBodyMode); |
1700 processEndTag(token); | 1700 processEndTag(token); |
1701 return; | 1701 return; |
1702 } | 1702 } |
1703 if (isTableBodyContextTag(token->name())) { | 1703 if (isTableBodyContextTag(token->name())) { |
1704 if (!m_tree.openElements()->inTableScope(token->name())) { | 1704 if (!m_tree.openElements()->inTableScope(token->name())) { |
1705 parseError(token); | 1705 parseError(token); |
1706 return; | 1706 return; |
1707 } | 1707 } |
1708 processFakeEndTag(trTag); | 1708 processFakeEndTag(trTag); |
1709 ASSERT(insertionMode() == InTableBodyMode); | 1709 ASSERT(getInsertionMode() == InTableBodyMode); |
1710 processEndTag(token); | 1710 processEndTag(token); |
1711 return; | 1711 return; |
1712 } | 1712 } |
1713 if (token->name() == bodyTag | 1713 if (token->name() == bodyTag |
1714 || isCaptionColOrColgroupTag(token->name()) | 1714 || isCaptionColOrColgroupTag(token->name()) |
1715 || token->name() == htmlTag | 1715 || token->name() == htmlTag |
1716 || isTableCellContextTag(token->name())) { | 1716 || isTableCellContextTag(token->name())) { |
1717 parseError(token); | 1717 parseError(token); |
1718 return; | 1718 return; |
1719 } | 1719 } |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1953 } | 1953 } |
1954 parseError(token); | 1954 parseError(token); |
1955 // Is this redirection necessary here? | 1955 // Is this redirection necessary here? |
1956 HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree); | 1956 HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree); |
1957 processEndTagForInBody(token); | 1957 processEndTagForInBody(token); |
1958 } | 1958 } |
1959 | 1959 |
1960 void HTMLTreeBuilder::processEndTag(AtomicHTMLToken* token) | 1960 void HTMLTreeBuilder::processEndTag(AtomicHTMLToken* token) |
1961 { | 1961 { |
1962 ASSERT(token->type() == HTMLToken::EndTag); | 1962 ASSERT(token->type() == HTMLToken::EndTag); |
1963 switch (insertionMode()) { | 1963 switch (getInsertionMode()) { |
1964 case InitialMode: | 1964 case InitialMode: |
1965 ASSERT(insertionMode() == InitialMode); | 1965 ASSERT(getInsertionMode() == InitialMode); |
1966 defaultForInitial(); | 1966 defaultForInitial(); |
1967 // Fall through. | 1967 // Fall through. |
1968 case BeforeHTMLMode: | 1968 case BeforeHTMLMode: |
1969 ASSERT(insertionMode() == BeforeHTMLMode); | 1969 ASSERT(getInsertionMode() == BeforeHTMLMode); |
1970 if (token->name() != headTag && token->name() != bodyTag && token->name(
) != htmlTag && token->name() != brTag) { | 1970 if (token->name() != headTag && token->name() != bodyTag && token->name(
) != htmlTag && token->name() != brTag) { |
1971 parseError(token); | 1971 parseError(token); |
1972 return; | 1972 return; |
1973 } | 1973 } |
1974 defaultForBeforeHTML(); | 1974 defaultForBeforeHTML(); |
1975 // Fall through. | 1975 // Fall through. |
1976 case BeforeHeadMode: | 1976 case BeforeHeadMode: |
1977 ASSERT(insertionMode() == BeforeHeadMode); | 1977 ASSERT(getInsertionMode() == BeforeHeadMode); |
1978 if (token->name() != headTag && token->name() != bodyTag && token->name(
) != htmlTag && token->name() != brTag) { | 1978 if (token->name() != headTag && token->name() != bodyTag && token->name(
) != htmlTag && token->name() != brTag) { |
1979 parseError(token); | 1979 parseError(token); |
1980 return; | 1980 return; |
1981 } | 1981 } |
1982 defaultForBeforeHead(); | 1982 defaultForBeforeHead(); |
1983 // Fall through. | 1983 // Fall through. |
1984 case InHeadMode: | 1984 case InHeadMode: |
1985 ASSERT(insertionMode() == InHeadMode); | 1985 ASSERT(getInsertionMode() == InHeadMode); |
1986 // FIXME: This case should be broken out into processEndTagForInHead, | 1986 // FIXME: This case should be broken out into processEndTagForInHead, |
1987 // because other end tag cases now refer to it ("process the token for u
sing the rules of the "in head" insertion mode"). | 1987 // because other end tag cases now refer to it ("process the token for u
sing the rules of the "in head" insertion mode"). |
1988 // but because the logic falls through to AfterHeadMode, that gets a lit
tle messy. | 1988 // but because the logic falls through to AfterHeadMode, that gets a lit
tle messy. |
1989 if (token->name() == templateTag) { | 1989 if (token->name() == templateTag) { |
1990 processTemplateEndTag(token); | 1990 processTemplateEndTag(token); |
1991 return; | 1991 return; |
1992 } | 1992 } |
1993 if (token->name() == headTag) { | 1993 if (token->name() == headTag) { |
1994 m_tree.openElements()->popHTMLHeadElement(); | 1994 m_tree.openElements()->popHTMLHeadElement(); |
1995 setInsertionMode(AfterHeadMode); | 1995 setInsertionMode(AfterHeadMode); |
1996 return; | 1996 return; |
1997 } | 1997 } |
1998 if (token->name() != bodyTag && token->name() != htmlTag && token->name(
) != brTag) { | 1998 if (token->name() != bodyTag && token->name() != htmlTag && token->name(
) != brTag) { |
1999 parseError(token); | 1999 parseError(token); |
2000 return; | 2000 return; |
2001 } | 2001 } |
2002 defaultForInHead(); | 2002 defaultForInHead(); |
2003 // Fall through. | 2003 // Fall through. |
2004 case AfterHeadMode: | 2004 case AfterHeadMode: |
2005 ASSERT(insertionMode() == AfterHeadMode); | 2005 ASSERT(getInsertionMode() == AfterHeadMode); |
2006 if (token->name() != bodyTag && token->name() != htmlTag && token->name(
) != brTag) { | 2006 if (token->name() != bodyTag && token->name() != htmlTag && token->name(
) != brTag) { |
2007 parseError(token); | 2007 parseError(token); |
2008 return; | 2008 return; |
2009 } | 2009 } |
2010 defaultForAfterHead(); | 2010 defaultForAfterHead(); |
2011 // Fall through | 2011 // Fall through |
2012 case InBodyMode: | 2012 case InBodyMode: |
2013 ASSERT(insertionMode() == InBodyMode); | 2013 ASSERT(getInsertionMode() == InBodyMode); |
2014 processEndTagForInBody(token); | 2014 processEndTagForInBody(token); |
2015 break; | 2015 break; |
2016 case InTableMode: | 2016 case InTableMode: |
2017 ASSERT(insertionMode() == InTableMode); | 2017 ASSERT(getInsertionMode() == InTableMode); |
2018 processEndTagForInTable(token); | 2018 processEndTagForInTable(token); |
2019 break; | 2019 break; |
2020 case InCaptionMode: | 2020 case InCaptionMode: |
2021 ASSERT(insertionMode() == InCaptionMode); | 2021 ASSERT(getInsertionMode() == InCaptionMode); |
2022 if (token->name() == captionTag) { | 2022 if (token->name() == captionTag) { |
2023 processCaptionEndTagForInCaption(); | 2023 processCaptionEndTagForInCaption(); |
2024 return; | 2024 return; |
2025 } | 2025 } |
2026 if (token->name() == tableTag) { | 2026 if (token->name() == tableTag) { |
2027 parseError(token); | 2027 parseError(token); |
2028 if (!processCaptionEndTagForInCaption()) { | 2028 if (!processCaptionEndTagForInCaption()) { |
2029 ASSERT(isParsingFragment()); | 2029 ASSERT(isParsingFragment()); |
2030 return; | 2030 return; |
2031 } | 2031 } |
2032 processEndTag(token); | 2032 processEndTag(token); |
2033 return; | 2033 return; |
2034 } | 2034 } |
2035 if (token->name() == bodyTag | 2035 if (token->name() == bodyTag |
2036 || token->name() == colTag | 2036 || token->name() == colTag |
2037 || token->name() == colgroupTag | 2037 || token->name() == colgroupTag |
2038 || token->name() == htmlTag | 2038 || token->name() == htmlTag |
2039 || isTableBodyContextTag(token->name()) | 2039 || isTableBodyContextTag(token->name()) |
2040 || isTableCellContextTag(token->name()) | 2040 || isTableCellContextTag(token->name()) |
2041 || token->name() == trTag) { | 2041 || token->name() == trTag) { |
2042 parseError(token); | 2042 parseError(token); |
2043 return; | 2043 return; |
2044 } | 2044 } |
2045 processEndTagForInBody(token); | 2045 processEndTagForInBody(token); |
2046 break; | 2046 break; |
2047 case InColumnGroupMode: | 2047 case InColumnGroupMode: |
2048 ASSERT(insertionMode() == InColumnGroupMode); | 2048 ASSERT(getInsertionMode() == InColumnGroupMode); |
2049 if (token->name() == colgroupTag) { | 2049 if (token->name() == colgroupTag) { |
2050 processColgroupEndTagForInColumnGroup(); | 2050 processColgroupEndTagForInColumnGroup(); |
2051 return; | 2051 return; |
2052 } | 2052 } |
2053 if (token->name() == colTag) { | 2053 if (token->name() == colTag) { |
2054 parseError(token); | 2054 parseError(token); |
2055 return; | 2055 return; |
2056 } | 2056 } |
2057 if (token->name() == templateTag) { | 2057 if (token->name() == templateTag) { |
2058 processTemplateEndTag(token); | 2058 processTemplateEndTag(token); |
2059 return; | 2059 return; |
2060 } | 2060 } |
2061 if (!processColgroupEndTagForInColumnGroup()) { | 2061 if (!processColgroupEndTagForInColumnGroup()) { |
2062 ASSERT(isParsingFragmentOrTemplateContents()); | 2062 ASSERT(isParsingFragmentOrTemplateContents()); |
2063 return; | 2063 return; |
2064 } | 2064 } |
2065 processEndTag(token); | 2065 processEndTag(token); |
2066 break; | 2066 break; |
2067 case InRowMode: | 2067 case InRowMode: |
2068 ASSERT(insertionMode() == InRowMode); | 2068 ASSERT(getInsertionMode() == InRowMode); |
2069 processEndTagForInRow(token); | 2069 processEndTagForInRow(token); |
2070 break; | 2070 break; |
2071 case InCellMode: | 2071 case InCellMode: |
2072 ASSERT(insertionMode() == InCellMode); | 2072 ASSERT(getInsertionMode() == InCellMode); |
2073 processEndTagForInCell(token); | 2073 processEndTagForInCell(token); |
2074 break; | 2074 break; |
2075 case InTableBodyMode: | 2075 case InTableBodyMode: |
2076 ASSERT(insertionMode() == InTableBodyMode); | 2076 ASSERT(getInsertionMode() == InTableBodyMode); |
2077 processEndTagForInTableBody(token); | 2077 processEndTagForInTableBody(token); |
2078 break; | 2078 break; |
2079 case AfterBodyMode: | 2079 case AfterBodyMode: |
2080 ASSERT(insertionMode() == AfterBodyMode); | 2080 ASSERT(getInsertionMode() == AfterBodyMode); |
2081 if (token->name() == htmlTag) { | 2081 if (token->name() == htmlTag) { |
2082 if (isParsingFragment()) { | 2082 if (isParsingFragment()) { |
2083 parseError(token); | 2083 parseError(token); |
2084 return; | 2084 return; |
2085 } | 2085 } |
2086 setInsertionMode(AfterAfterBodyMode); | 2086 setInsertionMode(AfterAfterBodyMode); |
2087 return; | 2087 return; |
2088 } | 2088 } |
2089 // Fall through. | 2089 // Fall through. |
2090 case AfterAfterBodyMode: | 2090 case AfterAfterBodyMode: |
2091 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfter
BodyMode); | 2091 ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == Afte
rAfterBodyMode); |
2092 parseError(token); | 2092 parseError(token); |
2093 setInsertionMode(InBodyMode); | 2093 setInsertionMode(InBodyMode); |
2094 processEndTag(token); | 2094 processEndTag(token); |
2095 break; | 2095 break; |
2096 case InHeadNoscriptMode: | 2096 case InHeadNoscriptMode: |
2097 ASSERT(insertionMode() == InHeadNoscriptMode); | 2097 ASSERT(getInsertionMode() == InHeadNoscriptMode); |
2098 if (token->name() == noscriptTag) { | 2098 if (token->name() == noscriptTag) { |
2099 ASSERT(m_tree.currentStackItem()->hasTagName(noscriptTag)); | 2099 ASSERT(m_tree.currentStackItem()->hasTagName(noscriptTag)); |
2100 m_tree.openElements()->pop(); | 2100 m_tree.openElements()->pop(); |
2101 ASSERT(m_tree.currentStackItem()->hasTagName(headTag)); | 2101 ASSERT(m_tree.currentStackItem()->hasTagName(headTag)); |
2102 setInsertionMode(InHeadMode); | 2102 setInsertionMode(InHeadMode); |
2103 return; | 2103 return; |
2104 } | 2104 } |
2105 if (token->name() != brTag) { | 2105 if (token->name() != brTag) { |
2106 parseError(token); | 2106 parseError(token); |
2107 return; | 2107 return; |
(...skipping 14 matching lines...) Expand all Loading... |
2122 // We must set the tokenizer's state to | 2122 // We must set the tokenizer's state to |
2123 // DataState explicitly if the tokenizer didn't have a chance to
. | 2123 // DataState explicitly if the tokenizer didn't have a chance to
. |
2124 m_parser->tokenizer()->setState(HTMLTokenizer::DataState); | 2124 m_parser->tokenizer()->setState(HTMLTokenizer::DataState); |
2125 } | 2125 } |
2126 return; | 2126 return; |
2127 } | 2127 } |
2128 m_tree.openElements()->pop(); | 2128 m_tree.openElements()->pop(); |
2129 setInsertionMode(m_originalInsertionMode); | 2129 setInsertionMode(m_originalInsertionMode); |
2130 break; | 2130 break; |
2131 case InFramesetMode: | 2131 case InFramesetMode: |
2132 ASSERT(insertionMode() == InFramesetMode); | 2132 ASSERT(getInsertionMode() == InFramesetMode); |
2133 if (token->name() == framesetTag) { | 2133 if (token->name() == framesetTag) { |
2134 bool ignoreFramesetForFragmentParsing = m_tree.currentIsRootNode(); | 2134 bool ignoreFramesetForFragmentParsing = m_tree.currentIsRootNode(); |
2135 ignoreFramesetForFragmentParsing = ignoreFramesetForFragmentParsing
|| m_tree.openElements()->hasTemplateInHTMLScope(); | 2135 ignoreFramesetForFragmentParsing = ignoreFramesetForFragmentParsing
|| m_tree.openElements()->hasTemplateInHTMLScope(); |
2136 if (ignoreFramesetForFragmentParsing) { | 2136 if (ignoreFramesetForFragmentParsing) { |
2137 ASSERT(isParsingFragmentOrTemplateContents()); | 2137 ASSERT(isParsingFragmentOrTemplateContents()); |
2138 parseError(token); | 2138 parseError(token); |
2139 return; | 2139 return; |
2140 } | 2140 } |
2141 m_tree.openElements()->pop(); | 2141 m_tree.openElements()->pop(); |
2142 if (!isParsingFragment() && !m_tree.currentStackItem()->hasTagName(f
ramesetTag)) | 2142 if (!isParsingFragment() && !m_tree.currentStackItem()->hasTagName(f
ramesetTag)) |
2143 setInsertionMode(AfterFramesetMode); | 2143 setInsertionMode(AfterFramesetMode); |
2144 return; | 2144 return; |
2145 } | 2145 } |
2146 if (token->name() == templateTag) { | 2146 if (token->name() == templateTag) { |
2147 processTemplateEndTag(token); | 2147 processTemplateEndTag(token); |
2148 return; | 2148 return; |
2149 } | 2149 } |
2150 break; | 2150 break; |
2151 case AfterFramesetMode: | 2151 case AfterFramesetMode: |
2152 ASSERT(insertionMode() == AfterFramesetMode); | 2152 ASSERT(getInsertionMode() == AfterFramesetMode); |
2153 if (token->name() == htmlTag) { | 2153 if (token->name() == htmlTag) { |
2154 setInsertionMode(AfterAfterFramesetMode); | 2154 setInsertionMode(AfterAfterFramesetMode); |
2155 return; | 2155 return; |
2156 } | 2156 } |
2157 // Fall through. | 2157 // Fall through. |
2158 case AfterAfterFramesetMode: | 2158 case AfterAfterFramesetMode: |
2159 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterA
fterFramesetMode); | 2159 ASSERT(getInsertionMode() == AfterFramesetMode || getInsertionMode() ==
AfterAfterFramesetMode); |
2160 parseError(token); | 2160 parseError(token); |
2161 break; | 2161 break; |
2162 case InSelectInTableMode: | 2162 case InSelectInTableMode: |
2163 ASSERT(insertionMode() == InSelectInTableMode); | 2163 ASSERT(getInsertionMode() == InSelectInTableMode); |
2164 if (token->name() == captionTag | 2164 if (token->name() == captionTag |
2165 || token->name() == tableTag | 2165 || token->name() == tableTag |
2166 || isTableBodyContextTag(token->name()) | 2166 || isTableBodyContextTag(token->name()) |
2167 || token->name() == trTag | 2167 || token->name() == trTag |
2168 || isTableCellContextTag(token->name())) { | 2168 || isTableCellContextTag(token->name())) { |
2169 parseError(token); | 2169 parseError(token); |
2170 if (m_tree.openElements()->inTableScope(token->name())) { | 2170 if (m_tree.openElements()->inTableScope(token->name())) { |
2171 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName
()); | 2171 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName
()); |
2172 processEndTag(&endSelect); | 2172 processEndTag(&endSelect); |
2173 processEndTag(token); | 2173 processEndTag(token); |
2174 } | 2174 } |
2175 return; | 2175 return; |
2176 } | 2176 } |
2177 // Fall through. | 2177 // Fall through. |
2178 case InSelectMode: | 2178 case InSelectMode: |
2179 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode); | 2179 ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSel
ectInTableMode); |
2180 if (token->name() == optgroupTag) { | 2180 if (token->name() == optgroupTag) { |
2181 if (m_tree.currentStackItem()->hasTagName(optionTag) && m_tree.oneBe
lowTop() && m_tree.oneBelowTop()->hasTagName(optgroupTag)) | 2181 if (m_tree.currentStackItem()->hasTagName(optionTag) && m_tree.oneBe
lowTop() && m_tree.oneBelowTop()->hasTagName(optgroupTag)) |
2182 processFakeEndTag(optionTag); | 2182 processFakeEndTag(optionTag); |
2183 if (m_tree.currentStackItem()->hasTagName(optgroupTag)) { | 2183 if (m_tree.currentStackItem()->hasTagName(optgroupTag)) { |
2184 m_tree.openElements()->pop(); | 2184 m_tree.openElements()->pop(); |
2185 return; | 2185 return; |
2186 } | 2186 } |
2187 parseError(token); | 2187 parseError(token); |
2188 return; | 2188 return; |
2189 } | 2189 } |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2266 // </pre> | 2266 // </pre> |
2267 // | 2267 // |
2268 // without getting an extra newline at the start of their <pre> element. | 2268 // without getting an extra newline at the start of their <pre> element. |
2269 if (m_shouldSkipLeadingNewline) { | 2269 if (m_shouldSkipLeadingNewline) { |
2270 m_shouldSkipLeadingNewline = false; | 2270 m_shouldSkipLeadingNewline = false; |
2271 buffer.skipAtMostOneLeadingNewline(); | 2271 buffer.skipAtMostOneLeadingNewline(); |
2272 if (buffer.isEmpty()) | 2272 if (buffer.isEmpty()) |
2273 return; | 2273 return; |
2274 } | 2274 } |
2275 | 2275 |
2276 switch (insertionMode()) { | 2276 switch (getInsertionMode()) { |
2277 case InitialMode: { | 2277 case InitialMode: { |
2278 ASSERT(insertionMode() == InitialMode); | 2278 ASSERT(getInsertionMode() == InitialMode); |
2279 buffer.skipLeadingWhitespace(); | 2279 buffer.skipLeadingWhitespace(); |
2280 if (buffer.isEmpty()) | 2280 if (buffer.isEmpty()) |
2281 return; | 2281 return; |
2282 defaultForInitial(); | 2282 defaultForInitial(); |
2283 // Fall through. | 2283 // Fall through. |
2284 } | 2284 } |
2285 case BeforeHTMLMode: { | 2285 case BeforeHTMLMode: { |
2286 ASSERT(insertionMode() == BeforeHTMLMode); | 2286 ASSERT(getInsertionMode() == BeforeHTMLMode); |
2287 buffer.skipLeadingWhitespace(); | 2287 buffer.skipLeadingWhitespace(); |
2288 if (buffer.isEmpty()) | 2288 if (buffer.isEmpty()) |
2289 return; | 2289 return; |
2290 defaultForBeforeHTML(); | 2290 defaultForBeforeHTML(); |
2291 // Fall through. | 2291 // Fall through. |
2292 } | 2292 } |
2293 case BeforeHeadMode: { | 2293 case BeforeHeadMode: { |
2294 ASSERT(insertionMode() == BeforeHeadMode); | 2294 ASSERT(getInsertionMode() == BeforeHeadMode); |
2295 buffer.skipLeadingWhitespace(); | 2295 buffer.skipLeadingWhitespace(); |
2296 if (buffer.isEmpty()) | 2296 if (buffer.isEmpty()) |
2297 return; | 2297 return; |
2298 defaultForBeforeHead(); | 2298 defaultForBeforeHead(); |
2299 // Fall through. | 2299 // Fall through. |
2300 } | 2300 } |
2301 case InHeadMode: { | 2301 case InHeadMode: { |
2302 ASSERT(insertionMode() == InHeadMode); | 2302 ASSERT(getInsertionMode() == InHeadMode); |
2303 String leadingWhitespace = buffer.takeLeadingWhitespace(); | 2303 String leadingWhitespace = buffer.takeLeadingWhitespace(); |
2304 if (!leadingWhitespace.isEmpty()) | 2304 if (!leadingWhitespace.isEmpty()) |
2305 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); | 2305 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); |
2306 if (buffer.isEmpty()) | 2306 if (buffer.isEmpty()) |
2307 return; | 2307 return; |
2308 defaultForInHead(); | 2308 defaultForInHead(); |
2309 // Fall through. | 2309 // Fall through. |
2310 } | 2310 } |
2311 case AfterHeadMode: { | 2311 case AfterHeadMode: { |
2312 ASSERT(insertionMode() == AfterHeadMode); | 2312 ASSERT(getInsertionMode() == AfterHeadMode); |
2313 String leadingWhitespace = buffer.takeLeadingWhitespace(); | 2313 String leadingWhitespace = buffer.takeLeadingWhitespace(); |
2314 if (!leadingWhitespace.isEmpty()) | 2314 if (!leadingWhitespace.isEmpty()) |
2315 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); | 2315 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); |
2316 if (buffer.isEmpty()) | 2316 if (buffer.isEmpty()) |
2317 return; | 2317 return; |
2318 defaultForAfterHead(); | 2318 defaultForAfterHead(); |
2319 // Fall through. | 2319 // Fall through. |
2320 } | 2320 } |
2321 case InBodyMode: | 2321 case InBodyMode: |
2322 case InCaptionMode: | 2322 case InCaptionMode: |
2323 case TemplateContentsMode: | 2323 case TemplateContentsMode: |
2324 case InCellMode: { | 2324 case InCellMode: { |
2325 ASSERT(insertionMode() == InBodyMode || insertionMode() == InCaptionMode
|| insertionMode() == InCellMode || insertionMode() == TemplateContentsMode); | 2325 ASSERT(getInsertionMode() == InBodyMode || getInsertionMode() == InCapti
onMode || getInsertionMode() == InCellMode || getInsertionMode() == TemplateCont
entsMode); |
2326 processCharacterBufferForInBody(buffer); | 2326 processCharacterBufferForInBody(buffer); |
2327 break; | 2327 break; |
2328 } | 2328 } |
2329 case InTableMode: | 2329 case InTableMode: |
2330 case InTableBodyMode: | 2330 case InTableBodyMode: |
2331 case InRowMode: { | 2331 case InRowMode: { |
2332 ASSERT(insertionMode() == InTableMode || insertionMode() == InTableBodyM
ode || insertionMode() == InRowMode); | 2332 ASSERT(getInsertionMode() == InTableMode || getInsertionMode() == InTabl
eBodyMode || getInsertionMode() == InRowMode); |
2333 ASSERT(m_pendingTableCharacters.isEmpty()); | 2333 ASSERT(m_pendingTableCharacters.isEmpty()); |
2334 if (m_tree.currentStackItem()->isElementNode() | 2334 if (m_tree.currentStackItem()->isElementNode() |
2335 && (m_tree.currentStackItem()->hasTagName(tableTag) | 2335 && (m_tree.currentStackItem()->hasTagName(tableTag) |
2336 || m_tree.currentStackItem()->hasTagName(tbodyTag) | 2336 || m_tree.currentStackItem()->hasTagName(tbodyTag) |
2337 || m_tree.currentStackItem()->hasTagName(tfootTag) | 2337 || m_tree.currentStackItem()->hasTagName(tfootTag) |
2338 || m_tree.currentStackItem()->hasTagName(theadTag) | 2338 || m_tree.currentStackItem()->hasTagName(theadTag) |
2339 || m_tree.currentStackItem()->hasTagName(trTag))) { | 2339 || m_tree.currentStackItem()->hasTagName(trTag))) { |
2340 m_originalInsertionMode = m_insertionMode; | 2340 m_originalInsertionMode = m_insertionMode; |
2341 setInsertionMode(InTableTextMode); | 2341 setInsertionMode(InTableTextMode); |
2342 // Note that we fall through to the InTableTextMode case below. | 2342 // Note that we fall through to the InTableTextMode case below. |
2343 } else { | 2343 } else { |
2344 HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree)
; | 2344 HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree)
; |
2345 processCharacterBufferForInBody(buffer); | 2345 processCharacterBufferForInBody(buffer); |
2346 break; | 2346 break; |
2347 } | 2347 } |
2348 // Fall through. | 2348 // Fall through. |
2349 } | 2349 } |
2350 case InTableTextMode: { | 2350 case InTableTextMode: { |
2351 buffer.giveRemainingTo(m_pendingTableCharacters); | 2351 buffer.giveRemainingTo(m_pendingTableCharacters); |
2352 break; | 2352 break; |
2353 } | 2353 } |
2354 case InColumnGroupMode: { | 2354 case InColumnGroupMode: { |
2355 ASSERT(insertionMode() == InColumnGroupMode); | 2355 ASSERT(getInsertionMode() == InColumnGroupMode); |
2356 String leadingWhitespace = buffer.takeLeadingWhitespace(); | 2356 String leadingWhitespace = buffer.takeLeadingWhitespace(); |
2357 if (!leadingWhitespace.isEmpty()) | 2357 if (!leadingWhitespace.isEmpty()) |
2358 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); | 2358 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); |
2359 if (buffer.isEmpty()) | 2359 if (buffer.isEmpty()) |
2360 return; | 2360 return; |
2361 if (!processColgroupEndTagForInColumnGroup()) { | 2361 if (!processColgroupEndTagForInColumnGroup()) { |
2362 ASSERT(isParsingFragmentOrTemplateContents()); | 2362 ASSERT(isParsingFragmentOrTemplateContents()); |
2363 // The spec tells us to drop these characters on the floor. | 2363 // The spec tells us to drop these characters on the floor. |
2364 buffer.skipLeadingNonWhitespace(); | 2364 buffer.skipLeadingNonWhitespace(); |
2365 if (buffer.isEmpty()) | 2365 if (buffer.isEmpty()) |
2366 return; | 2366 return; |
2367 } | 2367 } |
2368 goto ReprocessBuffer; | 2368 goto ReprocessBuffer; |
2369 } | 2369 } |
2370 case AfterBodyMode: | 2370 case AfterBodyMode: |
2371 case AfterAfterBodyMode: { | 2371 case AfterAfterBodyMode: { |
2372 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfter
BodyMode); | 2372 ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == Afte
rAfterBodyMode); |
2373 // FIXME: parse error | 2373 // FIXME: parse error |
2374 setInsertionMode(InBodyMode); | 2374 setInsertionMode(InBodyMode); |
2375 goto ReprocessBuffer; | 2375 goto ReprocessBuffer; |
2376 } | 2376 } |
2377 case TextMode: { | 2377 case TextMode: { |
2378 ASSERT(insertionMode() == TextMode); | 2378 ASSERT(getInsertionMode() == TextMode); |
2379 m_tree.insertTextNode(buffer.takeRemaining()); | 2379 m_tree.insertTextNode(buffer.takeRemaining()); |
2380 break; | 2380 break; |
2381 } | 2381 } |
2382 case InHeadNoscriptMode: { | 2382 case InHeadNoscriptMode: { |
2383 ASSERT(insertionMode() == InHeadNoscriptMode); | 2383 ASSERT(getInsertionMode() == InHeadNoscriptMode); |
2384 String leadingWhitespace = buffer.takeLeadingWhitespace(); | 2384 String leadingWhitespace = buffer.takeLeadingWhitespace(); |
2385 if (!leadingWhitespace.isEmpty()) | 2385 if (!leadingWhitespace.isEmpty()) |
2386 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); | 2386 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); |
2387 if (buffer.isEmpty()) | 2387 if (buffer.isEmpty()) |
2388 return; | 2388 return; |
2389 defaultForInHeadNoscript(); | 2389 defaultForInHeadNoscript(); |
2390 goto ReprocessBuffer; | 2390 goto ReprocessBuffer; |
2391 } | 2391 } |
2392 case InFramesetMode: | 2392 case InFramesetMode: |
2393 case AfterFramesetMode: { | 2393 case AfterFramesetMode: { |
2394 ASSERT(insertionMode() == InFramesetMode || insertionMode() == AfterFram
esetMode || insertionMode() == AfterAfterFramesetMode); | 2394 ASSERT(getInsertionMode() == InFramesetMode || getInsertionMode() == Aft
erFramesetMode || getInsertionMode() == AfterAfterFramesetMode); |
2395 String leadingWhitespace = buffer.takeRemainingWhitespace(); | 2395 String leadingWhitespace = buffer.takeRemainingWhitespace(); |
2396 if (!leadingWhitespace.isEmpty()) | 2396 if (!leadingWhitespace.isEmpty()) |
2397 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); | 2397 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); |
2398 // FIXME: We should generate a parse error if we skipped over any | 2398 // FIXME: We should generate a parse error if we skipped over any |
2399 // non-whitespace characters. | 2399 // non-whitespace characters. |
2400 break; | 2400 break; |
2401 } | 2401 } |
2402 case InSelectInTableMode: | 2402 case InSelectInTableMode: |
2403 case InSelectMode: { | 2403 case InSelectMode: { |
2404 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode); | 2404 ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSel
ectInTableMode); |
2405 m_tree.insertTextNode(buffer.takeRemaining()); | 2405 m_tree.insertTextNode(buffer.takeRemaining()); |
2406 break; | 2406 break; |
2407 } | 2407 } |
2408 case AfterAfterFramesetMode: { | 2408 case AfterAfterFramesetMode: { |
2409 String leadingWhitespace = buffer.takeRemainingWhitespace(); | 2409 String leadingWhitespace = buffer.takeRemainingWhitespace(); |
2410 if (!leadingWhitespace.isEmpty()) { | 2410 if (!leadingWhitespace.isEmpty()) { |
2411 m_tree.reconstructTheActiveFormattingElements(); | 2411 m_tree.reconstructTheActiveFormattingElements(); |
2412 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); | 2412 m_tree.insertTextNode(leadingWhitespace, AllWhitespace); |
2413 } | 2413 } |
2414 // FIXME: We should generate a parse error if we skipped over any | 2414 // FIXME: We should generate a parse error if we skipped over any |
2415 // non-whitespace characters. | 2415 // non-whitespace characters. |
2416 break; | 2416 break; |
2417 } | 2417 } |
2418 } | 2418 } |
2419 } | 2419 } |
2420 | 2420 |
2421 void HTMLTreeBuilder::processCharacterBufferForInBody(CharacterTokenBuffer& buff
er) | 2421 void HTMLTreeBuilder::processCharacterBufferForInBody(CharacterTokenBuffer& buff
er) |
2422 { | 2422 { |
2423 m_tree.reconstructTheActiveFormattingElements(); | 2423 m_tree.reconstructTheActiveFormattingElements(); |
2424 const String& characters = buffer.takeRemaining(); | 2424 const String& characters = buffer.takeRemaining(); |
2425 m_tree.insertTextNode(characters); | 2425 m_tree.insertTextNode(characters); |
2426 if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters)) | 2426 if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters)) |
2427 m_framesetOk = false; | 2427 m_framesetOk = false; |
2428 } | 2428 } |
2429 | 2429 |
2430 void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken* token) | 2430 void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken* token) |
2431 { | 2431 { |
2432 ASSERT(token->type() == HTMLToken::EndOfFile); | 2432 ASSERT(token->type() == HTMLToken::EndOfFile); |
2433 switch (insertionMode()) { | 2433 switch (getInsertionMode()) { |
2434 case InitialMode: | 2434 case InitialMode: |
2435 ASSERT(insertionMode() == InitialMode); | 2435 ASSERT(getInsertionMode() == InitialMode); |
2436 defaultForInitial(); | 2436 defaultForInitial(); |
2437 // Fall through. | 2437 // Fall through. |
2438 case BeforeHTMLMode: | 2438 case BeforeHTMLMode: |
2439 ASSERT(insertionMode() == BeforeHTMLMode); | 2439 ASSERT(getInsertionMode() == BeforeHTMLMode); |
2440 defaultForBeforeHTML(); | 2440 defaultForBeforeHTML(); |
2441 // Fall through. | 2441 // Fall through. |
2442 case BeforeHeadMode: | 2442 case BeforeHeadMode: |
2443 ASSERT(insertionMode() == BeforeHeadMode); | 2443 ASSERT(getInsertionMode() == BeforeHeadMode); |
2444 defaultForBeforeHead(); | 2444 defaultForBeforeHead(); |
2445 // Fall through. | 2445 // Fall through. |
2446 case InHeadMode: | 2446 case InHeadMode: |
2447 ASSERT(insertionMode() == InHeadMode); | 2447 ASSERT(getInsertionMode() == InHeadMode); |
2448 defaultForInHead(); | 2448 defaultForInHead(); |
2449 // Fall through. | 2449 // Fall through. |
2450 case AfterHeadMode: | 2450 case AfterHeadMode: |
2451 ASSERT(insertionMode() == AfterHeadMode); | 2451 ASSERT(getInsertionMode() == AfterHeadMode); |
2452 defaultForAfterHead(); | 2452 defaultForAfterHead(); |
2453 // Fall through | 2453 // Fall through |
2454 case InBodyMode: | 2454 case InBodyMode: |
2455 case InCellMode: | 2455 case InCellMode: |
2456 case InCaptionMode: | 2456 case InCaptionMode: |
2457 case InRowMode: | 2457 case InRowMode: |
2458 ASSERT(insertionMode() == InBodyMode || insertionMode() == InCellMode ||
insertionMode() == InCaptionMode || insertionMode() == InRowMode || insertionMo
de() == TemplateContentsMode); | 2458 ASSERT(getInsertionMode() == InBodyMode || getInsertionMode() == InCellM
ode || getInsertionMode() == InCaptionMode || getInsertionMode() == InRowMode ||
getInsertionMode() == TemplateContentsMode); |
2459 notImplemented(); // Emit parse error based on what elements are still o
pen. | 2459 notImplemented(); // Emit parse error based on what elements are still o
pen. |
2460 if (!m_templateInsertionModes.isEmpty() && processEndOfFileForInTemplate
Contents(token)) | 2460 if (!m_templateInsertionModes.isEmpty() && processEndOfFileForInTemplate
Contents(token)) |
2461 return; | 2461 return; |
2462 break; | 2462 break; |
2463 case AfterBodyMode: | 2463 case AfterBodyMode: |
2464 case AfterAfterBodyMode: | 2464 case AfterAfterBodyMode: |
2465 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfter
BodyMode); | 2465 ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == Afte
rAfterBodyMode); |
2466 break; | 2466 break; |
2467 case InHeadNoscriptMode: | 2467 case InHeadNoscriptMode: |
2468 ASSERT(insertionMode() == InHeadNoscriptMode); | 2468 ASSERT(getInsertionMode() == InHeadNoscriptMode); |
2469 defaultForInHeadNoscript(); | 2469 defaultForInHeadNoscript(); |
2470 processEndOfFile(token); | 2470 processEndOfFile(token); |
2471 return; | 2471 return; |
2472 case AfterFramesetMode: | 2472 case AfterFramesetMode: |
2473 case AfterAfterFramesetMode: | 2473 case AfterAfterFramesetMode: |
2474 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterA
fterFramesetMode); | 2474 ASSERT(getInsertionMode() == AfterFramesetMode || getInsertionMode() ==
AfterAfterFramesetMode); |
2475 break; | 2475 break; |
2476 case InColumnGroupMode: | 2476 case InColumnGroupMode: |
2477 if (m_tree.currentIsRootNode()) { | 2477 if (m_tree.currentIsRootNode()) { |
2478 ASSERT(isParsingFragment()); | 2478 ASSERT(isParsingFragment()); |
2479 return; // FIXME: Should we break here instead of returning? | 2479 return; // FIXME: Should we break here instead of returning? |
2480 } | 2480 } |
2481 ASSERT(m_tree.currentNode()->hasTagName(colgroupTag) || isHTMLTemplateEl
ement(m_tree.currentNode())); | 2481 ASSERT(m_tree.currentNode()->hasTagName(colgroupTag) || isHTMLTemplateEl
ement(m_tree.currentNode())); |
2482 processColgroupEndTagForInColumnGroup(); | 2482 processColgroupEndTagForInColumnGroup(); |
2483 // Fall through | 2483 // Fall through |
2484 case InFramesetMode: | 2484 case InFramesetMode: |
2485 case InTableMode: | 2485 case InTableMode: |
2486 case InTableBodyMode: | 2486 case InTableBodyMode: |
2487 case InSelectInTableMode: | 2487 case InSelectInTableMode: |
2488 case InSelectMode: | 2488 case InSelectMode: |
2489 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode
|| insertionMode() == InTableBodyMode || insertionMode() == InColumnGroupMode); | 2489 ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSel
ectInTableMode || getInsertionMode() == InTableMode || getInsertionMode() == InF
ramesetMode || getInsertionMode() == InTableBodyMode || getInsertionMode() == In
ColumnGroupMode); |
2490 if (m_tree.currentNode() != m_tree.openElements()->rootNode()) | 2490 if (m_tree.currentNode() != m_tree.openElements()->rootNode()) |
2491 parseError(token); | 2491 parseError(token); |
2492 if (!m_templateInsertionModes.isEmpty() && processEndOfFileForInTemplate
Contents(token)) | 2492 if (!m_templateInsertionModes.isEmpty() && processEndOfFileForInTemplate
Contents(token)) |
2493 return; | 2493 return; |
2494 break; | 2494 break; |
2495 case InTableTextMode: | 2495 case InTableTextMode: |
2496 defaultForInTableText(); | 2496 defaultForInTableText(); |
2497 processEndOfFile(token); | 2497 processEndOfFile(token); |
2498 return; | 2498 return; |
2499 case TextMode: | 2499 case TextMode: |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2812 ASSERT(m_isAttached); | 2812 ASSERT(m_isAttached); |
2813 // Warning, this may detach the parser. Do not do anything else after this. | 2813 // Warning, this may detach the parser. Do not do anything else after this. |
2814 m_tree.finishedParsing(); | 2814 m_tree.finishedParsing(); |
2815 } | 2815 } |
2816 | 2816 |
2817 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) | 2817 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) |
2818 { | 2818 { |
2819 } | 2819 } |
2820 | 2820 |
2821 } // namespace blink | 2821 } // namespace blink |
OLD | NEW |