Changeset 70293 in webkit
- Timestamp:
- Oct 21, 2010 10:49:12 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r70286 r70293 1 2010-10-21 James Simonsen <simonjam@chromium.org> 2 3 Reviewed by Adam Barth. 4 5 HTMLTreeBuilder's InForeignContent code needs a re-write 6 7 Foreign Content mode was changed significantly by: 8 http://www.w3.org/Bugs/Public/show_bug.cgi?id=10314 9 10 The differences can be seen here: 11 http://html5.org/tools/web-apps-tracker?from=5520&to=5522 12 13 This bug addresses all spec changes in the diff except the select scope 14 changes, which have already been fixed in a separate bug. 15 16 https://bugs.webkit.org/show_bug.cgi?id=46676 17 18 * html5lib/resources/webkit01.dat: Added the demo case for the new code. Added a case that exposes crash when not using hasTagName(). 19 * html5lib/runner-expected.txt: Since the behavior of InForeignContentMode has changed, the expectations need to be updated. These have been manually verified. 20 * platform/chromium/html5lib/runner-expected.txt: Ditto. 21 * platform/win/html5lib/runner-expected.txt: Ditto. 22 1 23 2010-10-21 Ryosuke Niwa <rniwa@webkit.org> 2 24 -
trunk/LayoutTests/html5lib/resources/webkit01.dat
r67969 r70293 536 536 | <div> 537 537 | "C" 538 539 #data 540 <svg><em><desc></em> 541 #errors 542 #document 543 | <html> 544 | <head> 545 | <body> 546 | <svg svg> 547 | <em> 548 | <desc> 549 550 #data 551 <table><tr><td><svg><desc><td></desc><circle> 552 #errors 553 #document 554 | <html> 555 | <head> 556 | <body> 557 | <table> 558 | <tbody> 559 | <tr> 560 | <td> 561 | <svg svg> 562 | <svg desc> 563 | <svg circle> 564 565 #data 566 <svg><tfoot></mi><td> 567 #errors 568 #document 569 | <html> 570 | <head> 571 | <body> 572 | <svg svg> 573 | <svg tfoot> 574 | <svg td> -
trunk/LayoutTests/html5lib/runner-expected.txt
r69745 r70293 53 53 resources/tests8.dat: PASS 54 54 55 resources/tests9.dat: PASS 56 55 resources/tests9.dat: 56 16 57 58 Test 16 of 27 in resources/tests9.dat failed. Input: 59 <!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux 60 Got: 61 | <!DOCTYPE html> 62 | <html> 63 | <head> 64 | <body> 65 | <table> 66 | <caption> 67 | <math math> 68 | <math mi> 69 | "foo" 70 | <math mi> 71 | "bar" 72 | "baz" 73 | <p> 74 | "quux" 75 Expected: 76 | <!DOCTYPE html> 77 | <html> 78 | <head> 79 | <body> 80 | <table> 81 | <caption> 82 | <math math> 83 | <math mi> 84 | "foo" 85 | <math mi> 86 | "bar" 87 | "baz" 88 | <p> 89 | "quux" 57 90 resources/tests10.dat: 91 15 92 36 58 93 38 59 94 51 60 95 52 96 97 Test 15 of 52 in resources/tests10.dat failed. Input: 98 <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux 99 Got: 100 | <!DOCTYPE html> 101 | <html> 102 | <head> 103 | <body> 104 | <table> 105 | <caption> 106 | <svg svg> 107 | <svg g> 108 | "foo" 109 | <svg g> 110 | "bar" 111 | "baz" 112 | <p> 113 | "quux" 114 Expected: 115 | <!DOCTYPE html> 116 | <html> 117 | <head> 118 | <body> 119 | <table> 120 | <caption> 121 | <svg svg> 122 | <svg g> 123 | "foo" 124 | <svg g> 125 | "bar" 126 | "baz" 127 | <p> 128 | "quux" 129 130 Test 36 of 52 in resources/tests10.dat failed. Input: 131 <math><mi><div><object><div><span></span></div></object></div></mi><mi> 132 Got: 133 | <html> 134 | <head> 135 | <body> 136 | <math math> 137 | <math mi> 138 | <div> 139 | <object> 140 | <div> 141 | <span> 142 | <math mi> 143 Expected: 144 | <html> 145 | <head> 146 | <body> 147 | <math math> 148 | <math mi> 149 | <div> 150 | <object> 151 | <div> 152 | <span> 153 | <mi> 61 154 62 155 Test 38 of 52 in resources/tests10.dat failed. Input: … … 155 248 156 249 resources/tests19.dat: 250 31 251 32 157 252 63 253 78 254 255 Test 31 of 97 in resources/tests19.dat failed. Input: 256 <!doctype html><p><math><mi><p><h1> 257 Got: 258 | <!DOCTYPE html> 259 | <html> 260 | <head> 261 | <body> 262 | <p> 263 | <math math> 264 | <math mi> 265 | <p> 266 | <h1> 267 Expected: 268 | <!DOCTYPE html> 269 | <html> 270 | <head> 271 | <body> 272 | <p> 273 | <math math> 274 | <math mi> 275 | <p> 276 | <h1> 277 278 Test 32 of 97 in resources/tests19.dat failed. Input: 279 <!doctype html><p><math><mi><p><h1> 280 Got: 281 | <!DOCTYPE html> 282 | <html> 283 | <head> 284 | <body> 285 | <p> 286 | <math math> 287 | <math mi> 288 | <p> 289 | <h1> 290 Expected: 291 | <!DOCTYPE html> 292 | <html> 293 | <head> 294 | <body> 295 | <p> 296 | <math math> 297 | <math mi> 298 | <p> 299 | <h1> 158 300 159 301 Test 63 of 97 in resources/tests19.dat failed. Input: … … 177 319 | <body> 178 320 | <keygen> 321 322 Test 78 of 97 in resources/tests19.dat failed. Input: 323 <!doctype html><p><math><mn><span></p>a 324 Got: 325 | <!DOCTYPE html> 326 | <html> 327 | <head> 328 | <body> 329 | <p> 330 | <math math> 331 | <math mn> 332 | <span> 333 | <p> 334 | "a" 335 Expected: 336 | <!DOCTYPE html> 337 | <html> 338 | <head> 339 | <body> 340 | <p> 341 | <math math> 342 | <math mn> 343 | <span> 344 | "a" 179 345 resources/tests20.dat: PASS 180 346 -
trunk/LayoutTests/platform/chromium/html5lib/runner-expected.txt
r69745 r70293 51 51 resources/tests8.dat: PASS 52 52 53 resources/tests9.dat: PASS 54 53 resources/tests9.dat: 54 16 55 56 Test 16 of 27 in resources/tests9.dat failed. Input: 57 <!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux 58 Got: 59 | <!DOCTYPE html> 60 | <html> 61 | <head> 62 | <body> 63 | <table> 64 | <caption> 65 | <math math> 66 | <math mi> 67 | "foo" 68 | <math mi> 69 | "bar" 70 | "baz" 71 | <p> 72 | "quux" 73 Expected: 74 | <!DOCTYPE html> 75 | <html> 76 | <head> 77 | <body> 78 | <table> 79 | <caption> 80 | <math math> 81 | <math mi> 82 | "foo" 83 | <math mi> 84 | "bar" 85 | "baz" 86 | <p> 87 | "quux" 55 88 resources/tests10.dat: 89 15 90 36 56 91 38 57 92 51 58 93 52 94 95 Test 15 of 52 in resources/tests10.dat failed. Input: 96 <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux 97 Got: 98 | <!DOCTYPE html> 99 | <html> 100 | <head> 101 | <body> 102 | <table> 103 | <caption> 104 | <svg svg> 105 | <svg g> 106 | "foo" 107 | <svg g> 108 | "bar" 109 | "baz" 110 | <p> 111 | "quux" 112 Expected: 113 | <!DOCTYPE html> 114 | <html> 115 | <head> 116 | <body> 117 | <table> 118 | <caption> 119 | <svg svg> 120 | <svg g> 121 | "foo" 122 | <svg g> 123 | "bar" 124 | "baz" 125 | <p> 126 | "quux" 127 128 Test 36 of 52 in resources/tests10.dat failed. Input: 129 <math><mi><div><object><div><span></span></div></object></div></mi><mi> 130 Got: 131 | <html> 132 | <head> 133 | <body> 134 | <math math> 135 | <math mi> 136 | <div> 137 | <object> 138 | <div> 139 | <span> 140 | <math mi> 141 Expected: 142 | <html> 143 | <head> 144 | <body> 145 | <math math> 146 | <math mi> 147 | <div> 148 | <object> 149 | <div> 150 | <span> 151 | <mi> 59 152 60 153 Test 38 of 52 in resources/tests10.dat failed. Input: … … 153 246 154 247 resources/tests19.dat: 248 31 249 32 155 250 63 251 78 252 253 Test 31 of 97 in resources/tests19.dat failed. Input: 254 <!doctype html><p><math><mi><p><h1> 255 Got: 256 | <!DOCTYPE html> 257 | <html> 258 | <head> 259 | <body> 260 | <p> 261 | <math math> 262 | <math mi> 263 | <p> 264 | <h1> 265 Expected: 266 | <!DOCTYPE html> 267 | <html> 268 | <head> 269 | <body> 270 | <p> 271 | <math math> 272 | <math mi> 273 | <p> 274 | <h1> 275 276 Test 32 of 97 in resources/tests19.dat failed. Input: 277 <!doctype html><p><math><mi><p><h1> 278 Got: 279 | <!DOCTYPE html> 280 | <html> 281 | <head> 282 | <body> 283 | <p> 284 | <math math> 285 | <math mi> 286 | <p> 287 | <h1> 288 Expected: 289 | <!DOCTYPE html> 290 | <html> 291 | <head> 292 | <body> 293 | <p> 294 | <math math> 295 | <math mi> 296 | <p> 297 | <h1> 156 298 157 299 Test 63 of 97 in resources/tests19.dat failed. Input: … … 173 315 | <body> 174 316 | <keygen> 317 318 Test 78 of 97 in resources/tests19.dat failed. Input: 319 <!doctype html><p><math><mn><span></p>a 320 Got: 321 | <!DOCTYPE html> 322 | <html> 323 | <head> 324 | <body> 325 | <p> 326 | <math math> 327 | <math mn> 328 | <span> 329 | <p> 330 | "a" 331 Expected: 332 | <!DOCTYPE html> 333 | <html> 334 | <head> 335 | <body> 336 | <p> 337 | <math math> 338 | <math mn> 339 | <span> 340 | "a" 175 341 resources/tests20.dat: PASS 176 342 -
trunk/LayoutTests/platform/win/html5lib/runner-expected.txt
r69745 r70293 32 32 resources/tests8.dat: PASS 33 33 34 resources/tests9.dat: PASS 35 34 resources/tests9.dat: 35 16 36 37 Test 16 of 27 in resources/tests9.dat failed. Input: 38 <!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux 39 Got: 40 | <!DOCTYPE html> 41 | <html> 42 | <head> 43 | <body> 44 | <table> 45 | <caption> 46 | <math math> 47 | <math mi> 48 | "foo" 49 | <math mi> 50 | "bar" 51 | "baz" 52 | <p> 53 | "quux" 54 Expected: 55 | <!DOCTYPE html> 56 | <html> 57 | <head> 58 | <body> 59 | <table> 60 | <caption> 61 | <math math> 62 | <math mi> 63 | "foo" 64 | <math mi> 65 | "bar" 66 | "baz" 67 | <p> 68 | "quux" 36 69 resources/tests10.dat: 70 15 71 36 37 72 38 38 73 51 39 74 52 75 76 Test 15 of 52 in resources/tests10.dat failed. Input: 77 <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux 78 Got: 79 | <!DOCTYPE html> 80 | <html> 81 | <head> 82 | <body> 83 | <table> 84 | <caption> 85 | <svg svg> 86 | <svg g> 87 | "foo" 88 | <svg g> 89 | "bar" 90 | "baz" 91 | <p> 92 | "quux" 93 Expected: 94 | <!DOCTYPE html> 95 | <html> 96 | <head> 97 | <body> 98 | <table> 99 | <caption> 100 | <svg svg> 101 | <svg g> 102 | "foo" 103 | <svg g> 104 | "bar" 105 | "baz" 106 | <p> 107 | "quux" 108 109 Test 36 of 52 in resources/tests10.dat failed. Input: 110 <math><mi><div><object><div><span></span></div></object></div></mi><mi> 111 Got: 112 | <html> 113 | <head> 114 | <body> 115 | <math math> 116 | <math mi> 117 | <div> 118 | <object> 119 | <div> 120 | <span> 121 | <math mi> 122 Expected: 123 | <html> 124 | <head> 125 | <body> 126 | <math math> 127 | <math mi> 128 | <div> 129 | <object> 130 | <div> 131 | <span> 132 | <mi> 40 133 41 134 Test 38 of 52 in resources/tests10.dat failed. Input: -
trunk/WebCore/ChangeLog
r70290 r70293 1 2010-10-21 James Simonsen <simonjam@chromium.org> 2 3 Reviewed by Adam Barth. 4 5 HTMLTreeBuilder's InForeignContent code needs a re-write 6 7 Foreign Content mode was changed significantly by: 8 http://www.w3.org/Bugs/Public/show_bug.cgi?id=10314 9 10 The differences can be seen here: 11 http://html5.org/tools/web-apps-tracker?from=5520&to=5522 12 13 This bug addresses all spec changes in the diff except the select scope 14 changes, which have already been fixed in a separate bug. 15 16 https://bugs.webkit.org/show_bug.cgi?id=46676 17 18 * html/parser/HTMLElementStack.cpp: 19 (WebCore::HTMLNames::isScopeMarker): Add foreign elements to list. 20 * html/parser/HTMLTreeBuilder.cpp: 21 (WebCore::HTMLTreeBuilder::HTMLTreeBuilder): 22 (WebCore::HTMLTreeBuilder::processDoctypeToken): Switch mode before reprocessing any tokens. 23 (WebCore::HTMLTreeBuilder::processStartTagForInBody): Ditto. Remove secondary insertion mode. 24 (WebCore::HTMLTreeBuilder::processStartTagForInTable): Switch mode before reprocessing any tokens. 25 (WebCore::HTMLTreeBuilder::processStartTag): Ditto. Remove secondary insertion mode. 26 (WebCore::HTMLTreeBuilder::resetInsertionModeAppropriately): Remove foreign var. Use hasTagName() instead of == localName() to fix bug with foreign elements. 27 (WebCore::HTMLTreeBuilder::processEndTagForInTableBody): Switch mode before reprocessing any tokens. 28 (WebCore::HTMLTreeBuilder::processEndTagForInRow): Ditto. 29 (WebCore::HTMLTreeBuilder::processEndTagForInCell): Ditto. 30 (WebCore::HTMLTreeBuilder::processEndTagForInBody): Ditto. 31 (WebCore::HTMLTreeBuilder::processEndTag): Ditto. 32 (WebCore::HTMLTreeBuilder::prepareToReprocessToken): Added. 33 (WebCore::HTMLTreeBuilder::reprocessStartTag): Added. 34 (WebCore::HTMLTreeBuilder::reprocessEndTag): Added. 35 (WebCore::HTMLTreeBuilder::processForeignContentUsingInBodyModeAndResetMode): Added. 36 (WebCore::HTMLTreeBuilder::resetForeignInsertionMode): Added. 37 (WebCore::HTMLTreeBuilder::processComment): Switch mode before reprocessing any tokens. 38 (WebCore::HTMLTreeBuilder::processCharacterBuffer): Ditto. 39 (WebCore::HTMLTreeBuilder::processEndOfFile): Ditto. 40 * html/parser/HTMLTreeBuilder.h: Functions and member for tracking potential switch from InForeignContentMode. 41 1 42 2010-10-21 Adam Barth <abarth@webkit.org> 2 43 -
trunk/WebCore/html/parser/HTMLElementStack.cpp
r70094 r70293 33 33 #include <wtf/PassOwnPtr.h> 34 34 35 #if ENABLE(SVG)36 #include "SVGNames.h"37 #endif38 39 35 namespace WebCore { 40 36 … … 57 53 return element->hasTagName(appletTag) 58 54 || element->hasTagName(captionTag) 59 #if ENABLE(SVG_FOREIGN_OBJECT)60 || element->hasTagName(SVGNames::foreignObjectTag)61 #endif62 55 || element->hasTagName(htmlTag) 63 56 || element->hasTagName(marqueeTag) … … 65 58 || element->hasTagName(tableTag) 66 59 || element->hasTagName(tdTag) 67 || element->hasTagName(thTag); 60 || element->hasTagName(thTag) 61 || element->hasTagName(MathMLNames::miTag) 62 || element->hasTagName(MathMLNames::moTag) 63 || element->hasTagName(MathMLNames::mnTag) 64 || element->hasTagName(MathMLNames::msTag) 65 || element->hasTagName(MathMLNames::mtextTag) 66 || element->hasTagName(MathMLNames::annotation_xmlTag) 67 || element->hasTagName(SVGNames::foreignObjectTag) 68 || element->hasTagName(SVGNames::descTag) 69 || element->hasTagName(SVGNames::titleTag); 68 70 } 69 71 -
trunk/WebCore/html/parser/HTMLTreeBuilder.cpp
r70181 r70293 106 106 bool isSpecialNode(Node* node) 107 107 { 108 if (node->hasTagName(SVGNames::foreignObjectTag)) 108 if (node->hasTagName(MathMLNames::miTag) 109 || node->hasTagName(MathMLNames::moTag) 110 || node->hasTagName(MathMLNames::mnTag) 111 || node->hasTagName(MathMLNames::msTag) 112 || node->hasTagName(MathMLNames::mtextTag) 113 || node->hasTagName(MathMLNames::annotation_xmlTag) 114 || node->hasTagName(SVGNames::foreignObjectTag) 115 || node->hasTagName(SVGNames::descTag) 116 || node->hasTagName(SVGNames::titleTag)) 109 117 return true; 110 118 if (node->namespaceURI() != xhtmlNamespaceURI) … … 332 340 , m_insertionMode(InitialMode) 333 341 , m_originalInsertionMode(InitialMode) 334 , m_secondaryInsertionMode(InitialMode)335 342 , m_tokenizer(tokenizer) 336 343 , m_scriptToProcessStartLine(uninitializedLineNumberValue) 337 344 , m_lastScriptElementStartLine(uninitializedLineNumberValue) 338 345 , m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks) 346 , m_hasPendingForeignInsertionModeSteps(false) 339 347 { 340 348 } … … 351 359 , m_insertionMode(InitialMode) 352 360 , m_originalInsertionMode(InitialMode) 353 , m_secondaryInsertionMode(InitialMode)354 361 , m_tokenizer(tokenizer) 355 362 , m_scriptToProcessStartLine(uninitializedLineNumberValue) 356 363 , m_lastScriptElementStartLine(uninitializedLineNumberValue) 357 364 , m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks) 365 , m_hasPendingForeignInsertionModeSteps(false) 358 366 { 359 367 if (contextElement) { … … 816 824 parseError(token); 817 825 processFakeEndTag(buttonTag); 818 processStartTag(token); // FIXME: Could we just fall through here?826 reprocessStartTag(token); // FIXME: Could we just fall through here? 819 827 return; 820 828 } … … 873 881 // Apparently we're not supposed to ask. 874 882 token.setName(imgTag.localName()); 883 prepareToReprocessToken(); 875 884 // Note the fall through to the imgTag handling below! 876 885 } … … 972 981 adjustForeignAttributes(token); 973 982 m_tree.insertForeignElement(token, MathMLNames::mathmlNamespaceURI); 974 if (m_insertionMode != InForeignContentMode) { 975 setSecondaryInsertionMode(m_insertionMode); 983 if (m_insertionMode != InForeignContentMode) 976 984 setInsertionMode(InForeignContentMode); 977 }978 985 return; 979 986 } … … 983 990 adjustForeignAttributes(token); 984 991 m_tree.insertForeignElement(token, SVGNames::svgNamespaceURI); 985 if (m_insertionMode != InForeignContentMode) { 986 setSecondaryInsertionMode(m_insertionMode); 992 if (m_insertionMode != InForeignContentMode) 987 993 setInsertionMode(InForeignContentMode); 988 }989 994 return; 990 995 } … … 1047 1052 processFakeStartTag(colgroupTag); 1048 1053 ASSERT(InColumnGroupMode); 1049 processStartTag(token);1054 reprocessStartTag(token); 1050 1055 return; 1051 1056 } … … 1060 1065 processFakeStartTag(tbodyTag); 1061 1066 ASSERT(insertionMode() == InTableBodyMode); 1062 processStartTag(token);1067 reprocessStartTag(token); 1063 1068 return; 1064 1069 } … … 1069 1074 return; 1070 1075 } 1071 processStartTag(token);1076 reprocessStartTag(token); 1072 1077 return; 1073 1078 } … … 1100 1105 namespace { 1101 1106 1102 bool shouldProcess UsingSecondaryInsertionMode(AtomicHTMLToken& token, Element* currentElement)1107 bool shouldProcessForeignContentUsingInBodyInsertionMode(AtomicHTMLToken& token, Element* currentElement) 1103 1108 { 1104 1109 ASSERT(token.type() == HTMLToken::StartTag); … … 1216 1221 return; 1217 1222 } 1218 processStartTag(token);1223 reprocessStartTag(token); 1219 1224 return; 1220 1225 } … … 1235 1240 return; 1236 1241 } 1237 processStartTag(token);1242 reprocessStartTag(token); 1238 1243 break; 1239 1244 case InTableBodyMode: … … 1249 1254 processFakeStartTag(trTag); 1250 1255 ASSERT(insertionMode() == InRowMode); 1251 processStartTag(token);1256 reprocessStartTag(token); 1252 1257 return; 1253 1258 } … … 1262 1267 ASSERT(isTableBodyContextTag(m_tree.currentElement()->localName())); 1263 1268 processFakeEndTag(m_tree.currentElement()->tagQName()); 1264 processStartTag(token);1269 reprocessStartTag(token); 1265 1270 return; 1266 1271 } … … 1284 1289 } 1285 1290 ASSERT(insertionMode() == InTableBodyMode); 1286 processStartTag(token);1291 reprocessStartTag(token); 1287 1292 return; 1288 1293 } … … 1302 1307 } 1303 1308 closeTheCell(); 1304 processStartTag(token);1309 reprocessStartTag(token); 1305 1310 return; 1306 1311 } … … 1315 1320 } 1316 1321 setInsertionMode(InBodyMode); 1317 processStartTag(token);1322 reprocessStartTag(token); 1318 1323 break; 1319 1324 case InHeadNoscriptMode: … … 1383 1388 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName()); 1384 1389 processEndTag(endSelect); 1385 processStartTag(token);1390 reprocessStartTag(token); 1386 1391 return; 1387 1392 } … … 1429 1434 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName()); 1430 1435 processEndTag(endSelect); 1431 processStartTag(token);1436 reprocessStartTag(token); 1432 1437 return; 1433 1438 } … … 1443 1448 break; 1444 1449 case InForeignContentMode: { 1445 if (shouldProcess UsingSecondaryInsertionMode(token, m_tree.currentElement())) {1446 process UsingSecondaryInsertionModeAndAdjustInsertionMode(token);1450 if (shouldProcessForeignContentUsingInBodyInsertionMode(token, m_tree.currentElement())) { 1451 processForeignContentUsingInBodyModeAndResetMode(token); 1447 1452 return; 1448 1453 } … … 1489 1494 parseError(token); 1490 1495 m_tree.openElements()->popUntilForeignContentScopeMarker(); 1491 if (insertionMode() == InForeignContentMode && m_tree.openElements()->hasOnlyHTMLElementsInScope()) 1492 setInsertionMode(m_secondaryInsertionMode); 1493 processStartTag(token); 1496 resetInsertionModeAppropriately(); 1497 reprocessStartTag(token); 1494 1498 return; 1495 1499 } … … 1497 1501 if (currentNamespace == MathMLNames::mathmlNamespaceURI) 1498 1502 adjustMathMLAttributes(token); 1499 1503 if (currentNamespace == SVGNames::svgNamespaceURI) { 1500 1504 adjustSVGTagNameCase(token); 1501 1505 adjustSVGAttributes(token); … … 1680 1684 } 1681 1685 1682 void HTMLTreeBuilder::setSecondaryInsertionMode(InsertionMode mode)1683 {1684 ASSERT(mode != InForeignContentMode);1685 m_secondaryInsertionMode = mode;1686 }1687 1688 void HTMLTreeBuilder::setInsertionModeAndEnd(InsertionMode newInsertionMode, bool foreign)1689 {1690 setInsertionMode(newInsertionMode);1691 if (foreign) {1692 setSecondaryInsertionMode(m_insertionMode);1693 setInsertionMode(InForeignContentMode);1694 }1695 }1696 1697 1686 void HTMLTreeBuilder::resetInsertionModeAppropriately() 1698 1687 { 1699 1688 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#reset-the-insertion-mode-appropriately 1700 1689 bool last = false; 1701 bool foreign = false;1702 1690 HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord(); 1703 1691 while (1) { … … 1710 1698 if (node->hasTagName(selectTag)) { 1711 1699 ASSERT(isParsingFragment()); 1712 return setInsertionMode AndEnd(InSelectMode, foreign);1700 return setInsertionMode(InSelectMode); 1713 1701 } 1714 1702 if (node->hasTagName(tdTag) || node->hasTagName(thTag)) 1715 return setInsertionMode AndEnd(InCellMode, foreign);1703 return setInsertionMode(InCellMode); 1716 1704 if (node->hasTagName(trTag)) 1717 return setInsertionMode AndEnd(InRowMode, foreign);1718 if ( isTableBodyContextTag(node->localName()))1719 return setInsertionMode AndEnd(InTableBodyMode, foreign);1705 return setInsertionMode(InRowMode); 1706 if (node->hasTagName(tbodyTag) || node->hasTagName(theadTag) || node->hasTagName(tfootTag)) 1707 return setInsertionMode(InTableBodyMode); 1720 1708 if (node->hasTagName(captionTag)) 1721 return setInsertionMode AndEnd(InCaptionMode, foreign);1709 return setInsertionMode(InCaptionMode); 1722 1710 if (node->hasTagName(colgroupTag)) { 1723 1711 ASSERT(isParsingFragment()); 1724 return setInsertionMode AndEnd(InColumnGroupMode, foreign);1712 return setInsertionMode(InColumnGroupMode); 1725 1713 } 1726 1714 if (node->hasTagName(tableTag)) 1727 return setInsertionMode AndEnd(InTableMode, foreign);1715 return setInsertionMode(InTableMode); 1728 1716 if (node->hasTagName(headTag)) { 1729 1717 ASSERT(isParsingFragment()); 1730 return setInsertionMode AndEnd(InBodyMode, foreign);1718 return setInsertionMode(InBodyMode); 1731 1719 } 1732 1720 if (node->hasTagName(bodyTag)) 1733 return setInsertionMode AndEnd(InBodyMode, foreign);1721 return setInsertionMode(InBodyMode); 1734 1722 if (node->hasTagName(framesetTag)) { 1735 1723 ASSERT(isParsingFragment()); 1736 return setInsertionMode AndEnd(InFramesetMode, foreign);1724 return setInsertionMode(InFramesetMode); 1737 1725 } 1738 1726 if (node->hasTagName(htmlTag)) { 1739 1727 ASSERT(isParsingFragment()); 1740 return setInsertionMode AndEnd(BeforeHeadMode, foreign);1728 return setInsertionMode(BeforeHeadMode); 1741 1729 } 1742 1730 if (node->namespaceURI() == SVGNames::svgNamespaceURI 1743 1731 || node->namespaceURI() == MathMLNames::mathmlNamespaceURI) 1744 foreign = true;1732 return setInsertionMode(InForeignContentMode); 1745 1733 if (last) { 1746 1734 ASSERT(isParsingFragment()); 1747 return setInsertionMode AndEnd(InBodyMode, foreign);1735 return setInsertionMode(InBodyMode); 1748 1736 } 1749 1737 nodeRecord = nodeRecord->next(); … … 1774 1762 ASSERT(isTableBodyContextTag(m_tree.currentElement()->localName())); 1775 1763 processFakeEndTag(m_tree.currentElement()->tagQName()); 1776 processEndTag(token);1764 reprocessEndTag(token); 1777 1765 return; 1778 1766 } … … 1801 1789 } 1802 1790 ASSERT(insertionMode() == InTableBodyMode); 1803 processEndTag(token);1791 reprocessEndTag(token); 1804 1792 return; 1805 1793 } … … 1811 1799 processFakeEndTag(trTag); 1812 1800 ASSERT(insertionMode() == InTableBodyMode); 1813 processEndTag(token);1801 reprocessEndTag(token); 1814 1802 return; 1815 1803 } … … 1855 1843 } 1856 1844 closeTheCell(); 1857 processEndTag(token);1845 reprocessEndTag(token); 1858 1846 return; 1859 1847 } … … 1871 1859 AtomicHTMLToken endBody(HTMLToken::EndTag, bodyTag.localName()); 1872 1860 if (processBodyEndTagForInBody(endBody)) 1873 processEndTag(token);1861 reprocessEndTag(token); 1874 1862 return; 1875 1863 } … … 1924 1912 processFakeStartTag(pTag); 1925 1913 ASSERT(m_tree.openElements()->inScope(token.name())); 1926 processEndTag(token);1914 reprocessEndTag(token); 1927 1915 return; 1928 1916 } … … 2120 2108 return; 2121 2109 } 2122 processEndTag(token);2110 reprocessEndTag(token); 2123 2111 return; 2124 2112 } … … 2149 2137 return; 2150 2138 } 2151 processEndTag(token);2139 reprocessEndTag(token); 2152 2140 break; 2153 2141 case InRowMode: … … 2173 2161 return; 2174 2162 } 2163 prepareToReprocessToken(); 2175 2164 // Fall through. 2176 2165 case AfterAfterBodyMode: … … 2178 2167 parseError(token); 2179 2168 setInsertionMode(InBodyMode); 2180 processEndTag(token);2169 reprocessEndTag(token); 2181 2170 break; 2182 2171 case InHeadNoscriptMode: … … 2254 2243 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName()); 2255 2244 processEndTag(endSelect); 2256 processEndTag(token);2245 reprocessEndTag(token); 2257 2246 } 2258 2247 return; … … 2315 2304 } 2316 2305 // Any other end tag (also the last two steps of "An end tag, if the current node is not an element in the HTML namespace." 2317 processUsingSecondaryInsertionModeAndAdjustInsertionMode(token); 2318 break; 2319 } 2306 processForeignContentUsingInBodyModeAndResetMode(token); 2307 break; 2308 } 2309 } 2310 2311 void HTMLTreeBuilder::prepareToReprocessToken() 2312 { 2313 if (m_hasPendingForeignInsertionModeSteps) { 2314 resetForeignInsertionMode(); 2315 m_hasPendingForeignInsertionModeSteps = false; 2316 } 2317 } 2318 2319 void HTMLTreeBuilder::reprocessStartTag(AtomicHTMLToken& token) 2320 { 2321 prepareToReprocessToken(); 2322 processStartTag(token); 2323 } 2324 2325 void HTMLTreeBuilder::reprocessEndTag(AtomicHTMLToken& token) 2326 { 2327 prepareToReprocessToken(); 2328 processEndTag(token); 2320 2329 } 2321 2330 … … 2340 2349 }; 2341 2350 2342 // This handles both secondary insertion mode processing, as well as updating 2343 // the insertion mode. These are separate steps in the spec, but always occur 2344 // right after one another. 2345 void HTMLTreeBuilder::processUsingSecondaryInsertionModeAndAdjustInsertionMode(AtomicHTMLToken& token) 2346 { 2347 ASSERT(token.type() == HTMLToken::StartTag || token.type() == HTMLToken::EndTag); 2351 void HTMLTreeBuilder::processForeignContentUsingInBodyModeAndResetMode(AtomicHTMLToken& token) 2352 { 2353 m_hasPendingForeignInsertionModeSteps = true; 2348 2354 { 2349 FakeInsertionMode fakeMode(this, m_secondaryInsertionMode);2355 FakeInsertionMode fakeMode(this, InBodyMode); 2350 2356 processToken(token); 2351 2357 } 2352 if (insertionMode() == InForeignContentMode && m_tree.openElements()->hasOnlyHTMLElementsInScope()) 2353 setInsertionMode(m_secondaryInsertionMode); 2358 if (m_hasPendingForeignInsertionModeSteps) 2359 resetForeignInsertionMode(); 2360 } 2361 2362 void HTMLTreeBuilder::resetForeignInsertionMode() 2363 { 2364 if (insertionMode() == InForeignContentMode) 2365 resetInsertionModeAppropriately(); 2354 2366 } 2355 2367 … … 2449 2461 m_originalInsertionMode = m_insertionMode; 2450 2462 setInsertionMode(InTableTextMode); 2463 prepareToReprocessToken(); 2451 2464 // Fall through. 2452 2465 } … … 2469 2482 return; 2470 2483 } 2484 prepareToReprocessToken(); 2471 2485 goto ReprocessBuffer; 2472 2486 } … … 2476 2490 // FIXME: parse error 2477 2491 setInsertionMode(InBodyMode); 2492 prepareToReprocessToken(); 2478 2493 goto ReprocessBuffer; 2479 2494 break; … … 2594 2609 return; 2595 2610 } 2611 prepareToReprocessToken(); 2596 2612 processEndOfFile(token); 2597 2613 return; 2598 2614 case InForeignContentMode: 2599 parseError(token); 2600 m_tree.openElements()->popUntilForeignContentScopeMarker(); 2601 // FIXME: The spec adds the following condition before setting the 2602 // insertion mode. However, this condition causes an infinite loop. 2603 // See http://www.w3.org/Bugs/Public/show_bug.cgi?id=10621 2604 // if (insertionMode() == InForeignContentMode && m_tree.openElements()->hasOnlyHTMLElementsInScope()) 2605 setInsertionMode(m_secondaryInsertionMode); 2615 setInsertionMode(InBodyMode); 2606 2616 processEndOfFile(token); 2607 2617 return; … … 2616 2626 m_tree.openElements()->pop(); 2617 2627 setInsertionMode(m_originalInsertionMode); 2628 prepareToReprocessToken(); 2618 2629 processEndOfFile(token); 2619 2630 return; … … 2630 2641 // FIXME: parse error 2631 2642 setInsertionMode(BeforeHTMLMode); 2643 prepareToReprocessToken(); 2632 2644 } 2633 2645 … … 2637 2649 m_tree.insertHTMLHtmlStartTagBeforeHTML(startHTML); 2638 2650 setInsertionMode(BeforeHeadMode); 2651 prepareToReprocessToken(); 2639 2652 } 2640 2653 … … 2643 2656 AtomicHTMLToken startHead(HTMLToken::StartTag, headTag.localName()); 2644 2657 processStartTag(startHead); 2658 prepareToReprocessToken(); 2645 2659 } 2646 2660 … … 2649 2663 AtomicHTMLToken endHead(HTMLToken::EndTag, headTag.localName()); 2650 2664 processEndTag(endHead); 2665 prepareToReprocessToken(); 2651 2666 } 2652 2667 … … 2655 2670 AtomicHTMLToken endNoscript(HTMLToken::EndTag, noscriptTag.localName()); 2656 2671 processEndTag(endNoscript); 2672 prepareToReprocessToken(); 2657 2673 } 2658 2674 … … 2662 2678 processStartTag(startBody); 2663 2679 m_framesetOk = true; 2680 prepareToReprocessToken(); 2664 2681 } 2665 2682 … … 2674 2691 m_framesetOk = false; 2675 2692 setInsertionMode(m_originalInsertionMode); 2693 prepareToReprocessToken(); 2676 2694 return; 2677 2695 } 2678 2696 m_tree.insertTextNode(characters); 2679 2697 setInsertionMode(m_originalInsertionMode); 2698 prepareToReprocessToken(); 2680 2699 } 2681 2700 -
trunk/WebCore/html/parser/HTMLTreeBuilder.h
r70181 r70293 164 164 void defaultForInTableText(); 165 165 166 void processUsingSecondaryInsertionModeAndAdjustInsertionMode(AtomicHTMLToken&); 166 void prepareToReprocessToken(); 167 168 void reprocessStartTag(AtomicHTMLToken&); 169 void reprocessEndTag(AtomicHTMLToken&); 167 170 168 171 PassRefPtr<NamedNodeMap> attributesForIsindexInput(AtomicHTMLToken&); … … 195 198 } 196 199 197 void setSecondaryInsertionMode(InsertionMode);198 199 void setInsertionModeAndEnd(InsertionMode, bool foreign); // Helper for resetInsertionModeAppropriately200 200 void resetInsertionModeAppropriately(); 201 202 void processForeignContentUsingInBodyModeAndResetMode(AtomicHTMLToken& token); 203 void resetForeignInsertionMode(); 201 204 202 205 class FragmentParsingContext : public Noncopyable { … … 237 240 InsertionMode m_insertionMode; 238 241 InsertionMode m_originalInsertionMode; 239 InsertionMode m_secondaryInsertionMode;240 242 241 243 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#pending-table-character-tokens … … 253 255 // some other things now. 254 256 int m_lastScriptElementStartLine; 255 257 256 258 bool m_usePreHTML5ParserQuirks; 259 260 bool m_hasPendingForeignInsertionModeSteps; 257 261 }; 258 262
Note: See TracChangeset
for help on using the changeset viewer.