Changeset 70293 in webkit


Ignore:
Timestamp:
Oct 21, 2010 10:49:12 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

2010-10-21 James Simonsen <simonjam@chromium.org>

Reviewed by Adam Barth.

HTMLTreeBuilder's InForeignContent code needs a re-write

Foreign Content mode was changed significantly by:
http://www.w3.org/Bugs/Public/show_bug.cgi?id=10314

The differences can be seen here:
http://html5.org/tools/web-apps-tracker?from=5520&to=5522

This bug addresses all spec changes in the diff except the select scope
changes, which have already been fixed in a separate bug.

https://bugs.webkit.org/show_bug.cgi?id=46676

  • html5lib/resources/webkit01.dat: Added the demo case for the new code. Added a case that exposes crash when not using hasTagName().
  • html5lib/runner-expected.txt: Since the behavior of InForeignContentMode has changed, the expectations need to be updated. These have been manually verified.
  • platform/chromium/html5lib/runner-expected.txt: Ditto.
  • platform/win/html5lib/runner-expected.txt: Ditto.

2010-10-21 James Simonsen <simonjam@chromium.org>

Reviewed by Adam Barth.

HTMLTreeBuilder's InForeignContent code needs a re-write

Foreign Content mode was changed significantly by:
http://www.w3.org/Bugs/Public/show_bug.cgi?id=10314

The differences can be seen here:
http://html5.org/tools/web-apps-tracker?from=5520&to=5522

This bug addresses all spec changes in the diff except the select scope
changes, which have already been fixed in a separate bug.

https://bugs.webkit.org/show_bug.cgi?id=46676

  • html/parser/HTMLElementStack.cpp: (WebCore::HTMLNames::isScopeMarker): Add foreign elements to list.
  • html/parser/HTMLTreeBuilder.cpp: (WebCore::HTMLTreeBuilder::HTMLTreeBuilder): (WebCore::HTMLTreeBuilder::processDoctypeToken): Switch mode before reprocessing any tokens. (WebCore::HTMLTreeBuilder::processStartTagForInBody): Ditto. Remove secondary insertion mode. (WebCore::HTMLTreeBuilder::processStartTagForInTable): Switch mode before reprocessing any tokens. (WebCore::HTMLTreeBuilder::processStartTag): Ditto. Remove secondary insertion mode. (WebCore::HTMLTreeBuilder::resetInsertionModeAppropriately): Remove foreign var. Use hasTagName() instead of == localName() to fix bug with foreign elements. (WebCore::HTMLTreeBuilder::processEndTagForInTableBody): Switch mode before reprocessing any tokens. (WebCore::HTMLTreeBuilder::processEndTagForInRow): Ditto. (WebCore::HTMLTreeBuilder::processEndTagForInCell): Ditto. (WebCore::HTMLTreeBuilder::processEndTagForInBody): Ditto. (WebCore::HTMLTreeBuilder::processEndTag): Ditto. (WebCore::HTMLTreeBuilder::prepareToReprocessToken): Added. (WebCore::HTMLTreeBuilder::reprocessStartTag): Added. (WebCore::HTMLTreeBuilder::reprocessEndTag): Added. (WebCore::HTMLTreeBuilder::processForeignContentUsingInBodyModeAndResetMode): Added. (WebCore::HTMLTreeBuilder::resetForeignInsertionMode): Added. (WebCore::HTMLTreeBuilder::processComment): Switch mode before reprocessing any tokens. (WebCore::HTMLTreeBuilder::processCharacterBuffer): Ditto. (WebCore::HTMLTreeBuilder::processEndOfFile): Ditto.
  • html/parser/HTMLTreeBuilder.h: Functions and member for tracking potential switch from InForeignContentMode.
Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r70286 r70293  
     12010-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
    1232010-10-21  Ryosuke Niwa  <rniwa@webkit.org>
    224
  • trunk/LayoutTests/html5lib/resources/webkit01.dat

    r67969 r70293  
    536536|         <div>
    537537|           "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  
    5353resources/tests8.dat: PASS
    5454
    55 resources/tests9.dat: PASS
    56 
     55resources/tests9.dat:
     5616
     57
     58Test 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
     60Got:
     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"
     75Expected:
     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"
    5790resources/tests10.dat:
     9115
     9236
    589338
    599451
    609552
     96
     97Test 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
     99Got:
     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"
     114Expected:
     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
     130Test 36 of 52 in resources/tests10.dat failed. Input:
     131<math><mi><div><object><div><span></span></div></object></div></mi><mi>
     132Got:
     133| <html>
     134|   <head>
     135|   <body>
     136|     <math math>
     137|       <math mi>
     138|         <div>
     139|           <object>
     140|             <div>
     141|               <span>
     142|       <math mi>
     143Expected:
     144| <html>
     145|   <head>
     146|   <body>
     147|     <math math>
     148|       <math mi>
     149|         <div>
     150|           <object>
     151|             <div>
     152|               <span>
     153|       <mi>
    61154
    62155Test 38 of 52 in resources/tests10.dat failed. Input:
     
    155248
    156249resources/tests19.dat:
     25031
     25132
    15725263
     25378
     254
     255Test 31 of 97 in resources/tests19.dat failed. Input:
     256<!doctype html><p><math><mi><p><h1>
     257Got:
     258| <!DOCTYPE html>
     259| <html>
     260|   <head>
     261|   <body>
     262|     <p>
     263|       <math math>
     264|         <math mi>
     265|           <p>
     266|           <h1>
     267Expected:
     268| <!DOCTYPE html>
     269| <html>
     270|   <head>
     271|   <body>
     272|     <p>
     273|       <math math>
     274|         <math mi>
     275|     <p>
     276|     <h1>
     277
     278Test 32 of 97 in resources/tests19.dat failed. Input:
     279<!doctype html><p><math><mi><p><h1>
     280Got:
     281| <!DOCTYPE html>
     282| <html>
     283|   <head>
     284|   <body>
     285|     <p>
     286|       <math math>
     287|         <math mi>
     288|           <p>
     289|           <h1>
     290Expected:
     291| <!DOCTYPE html>
     292| <html>
     293|   <head>
     294|   <body>
     295|     <p>
     296|       <math math>
     297|         <math mi>
     298|     <p>
     299|     <h1>
    158300
    159301Test 63 of 97 in resources/tests19.dat failed. Input:
     
    177319|   <body>
    178320|     <keygen>
     321
     322Test 78 of 97 in resources/tests19.dat failed. Input:
     323<!doctype html><p><math><mn><span></p>a
     324Got:
     325| <!DOCTYPE html>
     326| <html>
     327|   <head>
     328|   <body>
     329|     <p>
     330|       <math math>
     331|         <math mn>
     332|           <span>
     333|             <p>
     334|             "a"
     335Expected:
     336| <!DOCTYPE html>
     337| <html>
     338|   <head>
     339|   <body>
     340|     <p>
     341|       <math math>
     342|         <math mn>
     343|           <span>
     344|     "a"
    179345resources/tests20.dat: PASS
    180346
  • trunk/LayoutTests/platform/chromium/html5lib/runner-expected.txt

    r69745 r70293  
    5151resources/tests8.dat: PASS
    5252
    53 resources/tests9.dat: PASS
    54 
     53resources/tests9.dat:
     5416
     55
     56Test 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
     58Got:
     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"
     73Expected:
     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"
    5588resources/tests10.dat:
     8915
     9036
    569138
    579251
    589352
     94
     95Test 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
     97Got:
     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"
     112Expected:
     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
     128Test 36 of 52 in resources/tests10.dat failed. Input:
     129<math><mi><div><object><div><span></span></div></object></div></mi><mi>
     130Got:
     131| <html>
     132|   <head>
     133|   <body>
     134|     <math math>
     135|       <math mi>
     136|         <div>
     137|           <object>
     138|             <div>
     139|               <span>
     140|       <math mi>
     141Expected:
     142| <html>
     143|   <head>
     144|   <body>
     145|     <math math>
     146|       <math mi>
     147|         <div>
     148|           <object>
     149|             <div>
     150|               <span>
     151|       <mi>
    59152
    60153Test 38 of 52 in resources/tests10.dat failed. Input:
     
    153246
    154247resources/tests19.dat:
     24831
     24932
    15525063
     25178
     252
     253Test 31 of 97 in resources/tests19.dat failed. Input:
     254<!doctype html><p><math><mi><p><h1>
     255Got:
     256| <!DOCTYPE html>
     257| <html>
     258|   <head>
     259|   <body>
     260|     <p>
     261|       <math math>
     262|         <math mi>
     263|           <p>
     264|           <h1>
     265Expected:
     266| <!DOCTYPE html>
     267| <html>
     268|   <head>
     269|   <body>
     270|     <p>
     271|       <math math>
     272|         <math mi>
     273|     <p>
     274|     <h1>
     275
     276Test 32 of 97 in resources/tests19.dat failed. Input:
     277<!doctype html><p><math><mi><p><h1>
     278Got:
     279| <!DOCTYPE html>
     280| <html>
     281|   <head>
     282|   <body>
     283|     <p>
     284|       <math math>
     285|         <math mi>
     286|           <p>
     287|           <h1>
     288Expected:
     289| <!DOCTYPE html>
     290| <html>
     291|   <head>
     292|   <body>
     293|     <p>
     294|       <math math>
     295|         <math mi>
     296|     <p>
     297|     <h1>
    156298
    157299Test 63 of 97 in resources/tests19.dat failed. Input:
     
    173315|   <body>
    174316|     <keygen>
     317
     318Test 78 of 97 in resources/tests19.dat failed. Input:
     319<!doctype html><p><math><mn><span></p>a
     320Got:
     321| <!DOCTYPE html>
     322| <html>
     323|   <head>
     324|   <body>
     325|     <p>
     326|       <math math>
     327|         <math mn>
     328|           <span>
     329|             <p>
     330|             "a"
     331Expected:
     332| <!DOCTYPE html>
     333| <html>
     334|   <head>
     335|   <body>
     336|     <p>
     337|       <math math>
     338|         <math mn>
     339|           <span>
     340|     "a"
    175341resources/tests20.dat: PASS
    176342
  • trunk/LayoutTests/platform/win/html5lib/runner-expected.txt

    r69745 r70293  
    3232resources/tests8.dat: PASS
    3333
    34 resources/tests9.dat: PASS
    35 
     34resources/tests9.dat:
     3516
     36
     37Test 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
     39Got:
     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"
     54Expected:
     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"
    3669resources/tests10.dat:
     7015
     7136
    377238
    387351
    397452
     75
     76Test 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
     78Got:
     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"
     93Expected:
     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
     109Test 36 of 52 in resources/tests10.dat failed. Input:
     110<math><mi><div><object><div><span></span></div></object></div></mi><mi>
     111Got:
     112| <html>
     113|   <head>
     114|   <body>
     115|     <math math>
     116|       <math mi>
     117|         <div>
     118|           <object>
     119|             <div>
     120|               <span>
     121|       <math mi>
     122Expected:
     123| <html>
     124|   <head>
     125|   <body>
     126|     <math math>
     127|       <math mi>
     128|         <div>
     129|           <object>
     130|             <div>
     131|               <span>
     132|       <mi>
    40133
    41134Test 38 of 52 in resources/tests10.dat failed. Input:
  • trunk/WebCore/ChangeLog

    r70290 r70293  
     12010-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
    1422010-10-21  Adam Barth  <abarth@webkit.org>
    243
  • trunk/WebCore/html/parser/HTMLElementStack.cpp

    r70094 r70293  
    3333#include <wtf/PassOwnPtr.h>
    3434
    35 #if ENABLE(SVG)
    36 #include "SVGNames.h"
    37 #endif
    38 
    3935namespace WebCore {
    4036
     
    5753    return element->hasTagName(appletTag)
    5854        || element->hasTagName(captionTag)
    59 #if ENABLE(SVG_FOREIGN_OBJECT)
    60         || element->hasTagName(SVGNames::foreignObjectTag)
    61 #endif
    6255        || element->hasTagName(htmlTag)
    6356        || element->hasTagName(marqueeTag)
     
    6558        || element->hasTagName(tableTag)
    6659        || 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);
    6870}
    6971
  • trunk/WebCore/html/parser/HTMLTreeBuilder.cpp

    r70181 r70293  
    106106bool isSpecialNode(Node* node)
    107107{
    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))
    109117        return true;
    110118    if (node->namespaceURI() != xhtmlNamespaceURI)
     
    332340    , m_insertionMode(InitialMode)
    333341    , m_originalInsertionMode(InitialMode)
    334     , m_secondaryInsertionMode(InitialMode)
    335342    , m_tokenizer(tokenizer)
    336343    , m_scriptToProcessStartLine(uninitializedLineNumberValue)
    337344    , m_lastScriptElementStartLine(uninitializedLineNumberValue)
    338345    , m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks)
     346    , m_hasPendingForeignInsertionModeSteps(false)
    339347{
    340348}
     
    351359    , m_insertionMode(InitialMode)
    352360    , m_originalInsertionMode(InitialMode)
    353     , m_secondaryInsertionMode(InitialMode)
    354361    , m_tokenizer(tokenizer)
    355362    , m_scriptToProcessStartLine(uninitializedLineNumberValue)
    356363    , m_lastScriptElementStartLine(uninitializedLineNumberValue)
    357364    , m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks)
     365    , m_hasPendingForeignInsertionModeSteps(false)
    358366{
    359367    if (contextElement) {
     
    816824            parseError(token);
    817825            processFakeEndTag(buttonTag);
    818             processStartTag(token); // FIXME: Could we just fall through here?
     826            reprocessStartTag(token); // FIXME: Could we just fall through here?
    819827            return;
    820828        }
     
    873881        // Apparently we're not supposed to ask.
    874882        token.setName(imgTag.localName());
     883        prepareToReprocessToken();
    875884        // Note the fall through to the imgTag handling below!
    876885    }
     
    972981        adjustForeignAttributes(token);
    973982        m_tree.insertForeignElement(token, MathMLNames::mathmlNamespaceURI);
    974         if (m_insertionMode != InForeignContentMode) {
    975             setSecondaryInsertionMode(m_insertionMode);
     983        if (m_insertionMode != InForeignContentMode)
    976984            setInsertionMode(InForeignContentMode);
    977         }
    978985        return;
    979986    }
     
    983990        adjustForeignAttributes(token);
    984991        m_tree.insertForeignElement(token, SVGNames::svgNamespaceURI);
    985         if (m_insertionMode != InForeignContentMode) {
    986             setSecondaryInsertionMode(m_insertionMode);
     992        if (m_insertionMode != InForeignContentMode)
    987993            setInsertionMode(InForeignContentMode);
    988         }
    989994        return;
    990995    }
     
    10471052        processFakeStartTag(colgroupTag);
    10481053        ASSERT(InColumnGroupMode);
    1049         processStartTag(token);
     1054        reprocessStartTag(token);
    10501055        return;
    10511056    }
     
    10601065        processFakeStartTag(tbodyTag);
    10611066        ASSERT(insertionMode() == InTableBodyMode);
    1062         processStartTag(token);
     1067        reprocessStartTag(token);
    10631068        return;
    10641069    }
     
    10691074            return;
    10701075        }
    1071         processStartTag(token);
     1076        reprocessStartTag(token);
    10721077        return;
    10731078    }
     
    11001105namespace {
    11011106
    1102 bool shouldProcessUsingSecondaryInsertionMode(AtomicHTMLToken& token, Element* currentElement)
     1107bool shouldProcessForeignContentUsingInBodyInsertionMode(AtomicHTMLToken& token, Element* currentElement)
    11031108{
    11041109    ASSERT(token.type() == HTMLToken::StartTag);
     
    12161221                return;
    12171222            }
    1218             processStartTag(token);
     1223            reprocessStartTag(token);
    12191224            return;
    12201225        }
     
    12351240            return;
    12361241        }
    1237         processStartTag(token);
     1242        reprocessStartTag(token);
    12381243        break;
    12391244    case InTableBodyMode:
     
    12491254            processFakeStartTag(trTag);
    12501255            ASSERT(insertionMode() == InRowMode);
    1251             processStartTag(token);
     1256            reprocessStartTag(token);
    12521257            return;
    12531258        }
     
    12621267            ASSERT(isTableBodyContextTag(m_tree.currentElement()->localName()));
    12631268            processFakeEndTag(m_tree.currentElement()->tagQName());
    1264             processStartTag(token);
     1269            reprocessStartTag(token);
    12651270            return;
    12661271        }
     
    12841289            }
    12851290            ASSERT(insertionMode() == InTableBodyMode);
    1286             processStartTag(token);
     1291            reprocessStartTag(token);
    12871292            return;
    12881293        }
     
    13021307            }
    13031308            closeTheCell();
    1304             processStartTag(token);
     1309            reprocessStartTag(token);
    13051310            return;
    13061311        }
     
    13151320        }
    13161321        setInsertionMode(InBodyMode);
    1317         processStartTag(token);
     1322        reprocessStartTag(token);
    13181323        break;
    13191324    case InHeadNoscriptMode:
     
    13831388            AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName());
    13841389            processEndTag(endSelect);
    1385             processStartTag(token);
     1390            reprocessStartTag(token);
    13861391            return;
    13871392        }
     
    14291434            AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName());
    14301435            processEndTag(endSelect);
    1431             processStartTag(token);
     1436            reprocessStartTag(token);
    14321437            return;
    14331438        }
     
    14431448        break;
    14441449    case InForeignContentMode: {
    1445         if (shouldProcessUsingSecondaryInsertionMode(token, m_tree.currentElement())) {
    1446             processUsingSecondaryInsertionModeAndAdjustInsertionMode(token);
     1450        if (shouldProcessForeignContentUsingInBodyInsertionMode(token, m_tree.currentElement())) {
     1451            processForeignContentUsingInBodyModeAndResetMode(token);
    14471452            return;
    14481453        }
     
    14891494            parseError(token);
    14901495            m_tree.openElements()->popUntilForeignContentScopeMarker();
    1491             if (insertionMode() == InForeignContentMode && m_tree.openElements()->hasOnlyHTMLElementsInScope())
    1492                 setInsertionMode(m_secondaryInsertionMode);
    1493             processStartTag(token);
     1496            resetInsertionModeAppropriately();
     1497            reprocessStartTag(token);
    14941498            return;
    14951499        }
     
    14971501        if (currentNamespace == MathMLNames::mathmlNamespaceURI)
    14981502            adjustMathMLAttributes(token);
    1499          if (currentNamespace == SVGNames::svgNamespaceURI) {
     1503        if (currentNamespace == SVGNames::svgNamespaceURI) {
    15001504            adjustSVGTagNameCase(token);
    15011505            adjustSVGAttributes(token);
     
    16801684}
    16811685
    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 
    16971686void HTMLTreeBuilder::resetInsertionModeAppropriately()
    16981687{
    16991688    // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#reset-the-insertion-mode-appropriately
    17001689    bool last = false;
    1701     bool foreign = false;
    17021690    HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord();
    17031691    while (1) {
     
    17101698        if (node->hasTagName(selectTag)) {
    17111699            ASSERT(isParsingFragment());
    1712             return setInsertionModeAndEnd(InSelectMode, foreign);
     1700            return setInsertionMode(InSelectMode);
    17131701        }
    17141702        if (node->hasTagName(tdTag) || node->hasTagName(thTag))
    1715             return setInsertionModeAndEnd(InCellMode, foreign);
     1703            return setInsertionMode(InCellMode);
    17161704        if (node->hasTagName(trTag))
    1717             return setInsertionModeAndEnd(InRowMode, foreign);
    1718         if (isTableBodyContextTag(node->localName()))
    1719             return setInsertionModeAndEnd(InTableBodyMode, foreign);
     1705            return setInsertionMode(InRowMode);
     1706        if (node->hasTagName(tbodyTag) || node->hasTagName(theadTag) || node->hasTagName(tfootTag))
     1707            return setInsertionMode(InTableBodyMode);
    17201708        if (node->hasTagName(captionTag))
    1721             return setInsertionModeAndEnd(InCaptionMode, foreign);
     1709            return setInsertionMode(InCaptionMode);
    17221710        if (node->hasTagName(colgroupTag)) {
    17231711            ASSERT(isParsingFragment());
    1724             return setInsertionModeAndEnd(InColumnGroupMode, foreign);
     1712            return setInsertionMode(InColumnGroupMode);
    17251713        }
    17261714        if (node->hasTagName(tableTag))
    1727             return setInsertionModeAndEnd(InTableMode, foreign);
     1715            return setInsertionMode(InTableMode);
    17281716        if (node->hasTagName(headTag)) {
    17291717            ASSERT(isParsingFragment());
    1730             return setInsertionModeAndEnd(InBodyMode, foreign);
     1718            return setInsertionMode(InBodyMode);
    17311719        }
    17321720        if (node->hasTagName(bodyTag))
    1733             return setInsertionModeAndEnd(InBodyMode, foreign);
     1721            return setInsertionMode(InBodyMode);
    17341722        if (node->hasTagName(framesetTag)) {
    17351723            ASSERT(isParsingFragment());
    1736             return setInsertionModeAndEnd(InFramesetMode, foreign);
     1724            return setInsertionMode(InFramesetMode);
    17371725        }
    17381726        if (node->hasTagName(htmlTag)) {
    17391727            ASSERT(isParsingFragment());
    1740             return setInsertionModeAndEnd(BeforeHeadMode, foreign);
     1728            return setInsertionMode(BeforeHeadMode);
    17411729        }
    17421730        if (node->namespaceURI() == SVGNames::svgNamespaceURI
    17431731            || node->namespaceURI() == MathMLNames::mathmlNamespaceURI)
    1744             foreign = true;
     1732            return setInsertionMode(InForeignContentMode);
    17451733        if (last) {
    17461734            ASSERT(isParsingFragment());
    1747             return setInsertionModeAndEnd(InBodyMode, foreign);
     1735            return setInsertionMode(InBodyMode);
    17481736        }
    17491737        nodeRecord = nodeRecord->next();
     
    17741762        ASSERT(isTableBodyContextTag(m_tree.currentElement()->localName()));
    17751763        processFakeEndTag(m_tree.currentElement()->tagQName());
    1776         processEndTag(token);
     1764        reprocessEndTag(token);
    17771765        return;
    17781766    }
     
    18011789        }
    18021790        ASSERT(insertionMode() == InTableBodyMode);
    1803         processEndTag(token);
     1791        reprocessEndTag(token);
    18041792        return;
    18051793    }
     
    18111799        processFakeEndTag(trTag);
    18121800        ASSERT(insertionMode() == InTableBodyMode);
    1813         processEndTag(token);
     1801        reprocessEndTag(token);
    18141802        return;
    18151803    }
     
    18551843        }
    18561844        closeTheCell();
    1857         processEndTag(token);
     1845        reprocessEndTag(token);
    18581846        return;
    18591847    }
     
    18711859        AtomicHTMLToken endBody(HTMLToken::EndTag, bodyTag.localName());
    18721860        if (processBodyEndTagForInBody(endBody))
    1873             processEndTag(token);
     1861            reprocessEndTag(token);
    18741862        return;
    18751863    }
     
    19241912            processFakeStartTag(pTag);
    19251913            ASSERT(m_tree.openElements()->inScope(token.name()));
    1926             processEndTag(token);
     1914            reprocessEndTag(token);
    19271915            return;
    19281916        }
     
    21202108                return;
    21212109            }
    2122             processEndTag(token);
     2110            reprocessEndTag(token);
    21232111            return;
    21242112        }
     
    21492137            return;
    21502138        }
    2151         processEndTag(token);
     2139        reprocessEndTag(token);
    21522140        break;
    21532141    case InRowMode:
     
    21732161            return;
    21742162        }
     2163        prepareToReprocessToken();
    21752164        // Fall through.
    21762165    case AfterAfterBodyMode:
     
    21782167        parseError(token);
    21792168        setInsertionMode(InBodyMode);
    2180         processEndTag(token);
     2169        reprocessEndTag(token);
    21812170        break;
    21822171    case InHeadNoscriptMode:
     
    22542243                AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName());
    22552244                processEndTag(endSelect);
    2256                 processEndTag(token);
     2245                reprocessEndTag(token);
    22572246            }
    22582247            return;
     
    23152304        }
    23162305        // 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
     2311void HTMLTreeBuilder::prepareToReprocessToken()
     2312{
     2313    if (m_hasPendingForeignInsertionModeSteps) {
     2314        resetForeignInsertionMode();
     2315        m_hasPendingForeignInsertionModeSteps = false;
     2316    }
     2317}
     2318
     2319void HTMLTreeBuilder::reprocessStartTag(AtomicHTMLToken& token)
     2320{
     2321    prepareToReprocessToken();
     2322    processStartTag(token);
     2323}
     2324
     2325void HTMLTreeBuilder::reprocessEndTag(AtomicHTMLToken& token)
     2326{
     2327    prepareToReprocessToken();
     2328    processEndTag(token);
    23202329}
    23212330
     
    23402349};
    23412350
    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);
     2351void HTMLTreeBuilder::processForeignContentUsingInBodyModeAndResetMode(AtomicHTMLToken& token)
     2352{
     2353    m_hasPendingForeignInsertionModeSteps = true;
    23482354    {
    2349         FakeInsertionMode fakeMode(this, m_secondaryInsertionMode);
     2355        FakeInsertionMode fakeMode(this, InBodyMode);
    23502356        processToken(token);
    23512357    }
    2352     if (insertionMode() == InForeignContentMode && m_tree.openElements()->hasOnlyHTMLElementsInScope())
    2353         setInsertionMode(m_secondaryInsertionMode);
     2358    if (m_hasPendingForeignInsertionModeSteps)
     2359        resetForeignInsertionMode();
     2360}
     2361
     2362void HTMLTreeBuilder::resetForeignInsertionMode()
     2363{
     2364    if (insertionMode() == InForeignContentMode)
     2365        resetInsertionModeAppropriately();
    23542366}
    23552367
     
    24492461        m_originalInsertionMode = m_insertionMode;
    24502462        setInsertionMode(InTableTextMode);
     2463        prepareToReprocessToken();
    24512464        // Fall through.
    24522465    }
     
    24692482                return;
    24702483        }
     2484        prepareToReprocessToken();
    24712485        goto ReprocessBuffer;
    24722486    }
     
    24762490        // FIXME: parse error
    24772491        setInsertionMode(InBodyMode);
     2492        prepareToReprocessToken();
    24782493        goto ReprocessBuffer;
    24792494        break;
     
    25942609            return;
    25952610        }
     2611        prepareToReprocessToken();
    25962612        processEndOfFile(token);
    25972613        return;
    25982614    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);
    26062616        processEndOfFile(token);
    26072617        return;
     
    26162626        m_tree.openElements()->pop();
    26172627        setInsertionMode(m_originalInsertionMode);
     2628        prepareToReprocessToken();
    26182629        processEndOfFile(token);
    26192630        return;
     
    26302641    // FIXME: parse error
    26312642    setInsertionMode(BeforeHTMLMode);
     2643    prepareToReprocessToken();
    26322644}
    26332645
     
    26372649    m_tree.insertHTMLHtmlStartTagBeforeHTML(startHTML);
    26382650    setInsertionMode(BeforeHeadMode);
     2651    prepareToReprocessToken();
    26392652}
    26402653
     
    26432656    AtomicHTMLToken startHead(HTMLToken::StartTag, headTag.localName());
    26442657    processStartTag(startHead);
     2658    prepareToReprocessToken();
    26452659}
    26462660
     
    26492663    AtomicHTMLToken endHead(HTMLToken::EndTag, headTag.localName());
    26502664    processEndTag(endHead);
     2665    prepareToReprocessToken();
    26512666}
    26522667
     
    26552670    AtomicHTMLToken endNoscript(HTMLToken::EndTag, noscriptTag.localName());
    26562671    processEndTag(endNoscript);
     2672    prepareToReprocessToken();
    26572673}
    26582674
     
    26622678    processStartTag(startBody);
    26632679    m_framesetOk = true;
     2680    prepareToReprocessToken();
    26642681}
    26652682
     
    26742691        m_framesetOk = false;
    26752692        setInsertionMode(m_originalInsertionMode);
     2693        prepareToReprocessToken();
    26762694        return;
    26772695    }
    26782696    m_tree.insertTextNode(characters);
    26792697    setInsertionMode(m_originalInsertionMode);
     2698    prepareToReprocessToken();
    26802699}
    26812700
  • trunk/WebCore/html/parser/HTMLTreeBuilder.h

    r70181 r70293  
    164164    void defaultForInTableText();
    165165
    166     void processUsingSecondaryInsertionModeAndAdjustInsertionMode(AtomicHTMLToken&);
     166    void prepareToReprocessToken();
     167
     168    void reprocessStartTag(AtomicHTMLToken&);
     169    void reprocessEndTag(AtomicHTMLToken&);
    167170
    168171    PassRefPtr<NamedNodeMap> attributesForIsindexInput(AtomicHTMLToken&);
     
    195198    }
    196199
    197     void setSecondaryInsertionMode(InsertionMode);
    198 
    199     void setInsertionModeAndEnd(InsertionMode, bool foreign); // Helper for resetInsertionModeAppropriately
    200200    void resetInsertionModeAppropriately();
     201
     202    void processForeignContentUsingInBodyModeAndResetMode(AtomicHTMLToken& token);
     203    void resetForeignInsertionMode();
    201204
    202205    class FragmentParsingContext : public Noncopyable {
     
    237240    InsertionMode m_insertionMode;
    238241    InsertionMode m_originalInsertionMode;
    239     InsertionMode m_secondaryInsertionMode;
    240242
    241243    // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#pending-table-character-tokens
     
    253255    // some other things now.
    254256    int m_lastScriptElementStartLine;
    255    
     257
    256258    bool m_usePreHTML5ParserQuirks;
     259
     260    bool m_hasPendingForeignInsertionModeSteps;
    257261};
    258262
Note: See TracChangeset for help on using the changeset viewer.