Changeset 142531 in webkit


Ignore:
Timestamp:
Feb 11, 2013 3:34:55 PM (11 years ago)
Author:
rafaelw@chromium.org
Message:

[HTMLTemplateElement] <template> inside of <head> may not create <body> if EOF is hit
https://bugs.webkit.org/show_bug.cgi?id=109338

Reviewed by Adam Barth.

Source/WebCore:

This patch adds the logic to clear the stack of open elements back to the first <template> when EOF
is hit. This allows a <body> to be generated if the initial <template> was opened inside of <head>.

Tests added to html5lib.

  • html/parser/HTMLTreeBuilder.cpp:

(WebCore):
(WebCore::HTMLTreeBuilder::popAllTemplates):
(WebCore::HTMLTreeBuilder::processEndTag):
(WebCore::HTMLTreeBuilder::processEndOfFile):

  • html/parser/HTMLTreeBuilder.h:

(HTMLTreeBuilder):

LayoutTests:

  • html5lib/resources/template.dat:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r142527 r142531  
     12013-02-11  Rafael Weinstein  <rafaelw@chromium.org>
     2
     3        [HTMLTemplateElement] <template> inside of <head> may not create <body> if EOF is hit
     4        https://bugs.webkit.org/show_bug.cgi?id=109338
     5
     6        Reviewed by Adam Barth.
     7
     8        * html5lib/resources/template.dat:
     9
    1102013-02-11  Bem Jones-Bey  <bjonesbe@adobe.com>
    211
  • trunk/LayoutTests/html5lib/resources/template.dat

    r142049 r142531  
    984984|             <td>
    985985|               "Foo"
     986
     987#data
     988<template></figcaption><sub><table></table>
     989#errors
     990#document
     991| <html>
     992|   <head>
     993|     <template>
     994|       #document-fragment
     995|         <sub>
     996|           <table>
     997|   <body>
     998
     999#data
     1000<template><template>
     1001#errors
     1002#document
     1003| <html>
     1004|   <head>
     1005|     <template>
     1006|       #document-fragment
     1007|         <template>
     1008|           #document-fragment
     1009|   <body>
     1010
     1011#data
     1012<template><div>
     1013#errors
     1014#document
     1015| <html>
     1016|   <head>
     1017|     <template>
     1018|       #document-fragment
     1019|         <div>
     1020|   <body>
     1021
     1022#data
     1023<template><template><div>
     1024#errors
     1025#document
     1026| <html>
     1027|   <head>
     1028|     <template>
     1029|       #document-fragment
     1030|         <template>
     1031|           #document-fragment
     1032|             <div>
     1033|   <body>
     1034
     1035#data
     1036<template><template><table>
     1037#errors
     1038#document
     1039| <html>
     1040|   <head>
     1041|     <template>
     1042|       #document-fragment
     1043|         <template>
     1044|           #document-fragment
     1045|             <table>
     1046|   <body>
     1047
     1048#data
     1049<template><template><tbody>
     1050#errors
     1051#document
     1052| <html>
     1053|   <head>
     1054|     <template>
     1055|       #document-fragment
     1056|         <template>
     1057|           #document-fragment
     1058|             <tbody>
     1059|   <body>
     1060
     1061#data
     1062<template><template><tr>
     1063#errors
     1064#document
     1065| <html>
     1066|   <head>
     1067|     <template>
     1068|       #document-fragment
     1069|         <template>
     1070|           #document-fragment
     1071|             <tr>
     1072|   <body>
     1073
     1074#data
     1075<template><template><td>
     1076#errors
     1077#document
     1078| <html>
     1079|   <head>
     1080|     <template>
     1081|       #document-fragment
     1082|         <template>
     1083|           #document-fragment
     1084|             <td>
     1085|   <body>
     1086
     1087#data
     1088<template><template><caption>
     1089#errors
     1090#document
     1091| <html>
     1092|   <head>
     1093|     <template>
     1094|       #document-fragment
     1095|         <template>
     1096|           #document-fragment
     1097|             <caption>
     1098|   <body>
     1099
     1100#data
     1101<template><template><colgroup>
     1102#errors
     1103#document
     1104| <html>
     1105|   <head>
     1106|     <template>
     1107|       #document-fragment
     1108|         <template>
     1109|           #document-fragment
     1110|             <colgroup>
     1111|   <body>
     1112
     1113#data
     1114<template><template><col>
     1115#errors
     1116#document
     1117| <html>
     1118|   <head>
     1119|     <template>
     1120|       #document-fragment
     1121|         <template>
     1122|           #document-fragment
     1123|             <col>
     1124|   <body>
     1125
     1126#data
     1127<template><template><tbody><select>
     1128#errors
     1129#document
     1130| <html>
     1131|   <head>
     1132|     <template>
     1133|       #document-fragment
     1134|         <template>
     1135|           #document-fragment
     1136|             <tbody>
     1137|             <select>
     1138|   <body>
     1139
     1140#data
     1141<template><template><table>Foo
     1142#errors
     1143#document
     1144| <html>
     1145|   <head>
     1146|     <template>
     1147|       #document-fragment
     1148|         <template>
     1149|           #document-fragment
     1150|             <table>
     1151|             "Foo"
     1152|   <body>
     1153
     1154#data
     1155<template><template><frame>
     1156#errors
     1157#document
     1158| <html>
     1159|   <head>
     1160|     <template>
     1161|       #document-fragment
     1162|         <template>
     1163|           #document-fragment
     1164|             <frame>
     1165|   <body>
     1166
     1167#data
     1168<template><template><script>var i
     1169#errors
     1170#document
     1171| <html>
     1172|   <head>
     1173|     <template>
     1174|       #document-fragment
     1175|         <template>
     1176|           #document-fragment
     1177|             <script>
     1178|               "var i"
     1179|   <body>
     1180
     1181#data
     1182<template><template><style>var i
     1183#errors
     1184#document
     1185| <html>
     1186|   <head>
     1187|     <template>
     1188|       #document-fragment
     1189|         <template>
     1190|           #document-fragment
     1191|             <style>
     1192|               "var i"
     1193|   <body>
  • trunk/Source/WebCore/ChangeLog

    r142529 r142531  
     12013-02-11  Rafael Weinstein  <rafaelw@chromium.org>
     2
     3        [HTMLTemplateElement] <template> inside of <head> may not create <body> if EOF is hit
     4        https://bugs.webkit.org/show_bug.cgi?id=109338
     5
     6        Reviewed by Adam Barth.
     7
     8        This patch adds the logic to clear the stack of open elements back to the first <template> when EOF
     9        is hit. This allows a <body> to be generated if the initial <template> was opened inside of <head>.
     10
     11        Tests added to html5lib.
     12
     13        * html/parser/HTMLTreeBuilder.cpp:
     14        (WebCore):
     15        (WebCore::HTMLTreeBuilder::popAllTemplates):
     16        (WebCore::HTMLTreeBuilder::processEndTag):
     17        (WebCore::HTMLTreeBuilder::processEndOfFile):
     18        * html/parser/HTMLTreeBuilder.h:
     19        (HTMLTreeBuilder):
     20
    1212013-02-11  Andreas Kling  <akling@apple.com>
    222
  • trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp

    r142049 r142531  
    970970    resetInsertionModeAppropriately();
    971971}
     972
     973bool HTMLTreeBuilder::popAllTemplatesForEndOfFile()
     974{
     975    if (m_templateInsertionModes.isEmpty())
     976        return false;
     977
     978    while (!m_templateInsertionModes.isEmpty()) {
     979        if (m_tree.currentIsRootNode())
     980            return false;
     981        if (m_tree.currentNode()->hasTagName(templateTag))
     982            m_templateInsertionModes.removeLast();
     983        m_tree.openElements()->pop();
     984    }
     985
     986    resetInsertionModeAppropriately();
     987    return true;
     988}
    972989#endif
    973990
    974991bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup()
    975992{
    976     if (m_tree.currentIsRootNode() || m_tree.currentNode()->hasTagName(templateTag)) {
     993    bool ignoreFakeEndTag = m_tree.currentIsRootNode();
     994#if ENABLE(TEMPLATE_ELEMENT)
     995    ignoreFakeEndTag = ignoreFakeEndTag || m_tree.currentNode()->hasTagName(templateTag);
     996#endif
     997
     998    if (ignoreFakeEndTag) {
    977999        ASSERT(isParsingFragmentOrTemplateContents());
    9781000        // FIXME: parse error
     
    25022524{
    25032525    ASSERT(token->type() == HTMLTokenTypes::EndOfFile);
    2504 #if ENABLE(TEMPLATE_ELEMENT)
    2505     m_templateInsertionModes.clear();
    2506 #endif
    25072526    switch (insertionMode()) {
    25082527    case InitialMode:
     
    25372556#endif
    25382557        notImplemented(); // Emit parse error based on what elements are still open.
     2558#if ENABLE(TEMPLATE_ELEMENT)
     2559        if (popAllTemplatesForEndOfFile()) {
     2560            processEndOfFile(token);
     2561            return;
     2562        }
     2563#endif
    25392564        break;
    25402565    case AfterBodyMode:
     
    25512576        ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterAfterFramesetMode);
    25522577        break;
     2578    case InColumnGroupMode:
     2579        if (m_tree.currentIsRootNode()) {
     2580            ASSERT(isParsingFragment());
     2581            return; // FIXME: Should we break here instead of returning?
     2582        }
     2583#if ENABLE(TEMPLATE_ELEMENT)
     2584        ASSERT(m_tree.currentNode()->hasTagName(colgroupTag));
     2585#else
     2586        ASSERT(m_tree.currentNode()->hasTagName(colgroupTag) || m_tree.currentNode()->hasTagName(templateTag));
     2587#endif
     2588        processColgroupEndTagForInColumnGroup();
     2589        // Fall through
    25532590    case InFramesetMode:
    25542591    case InTableMode:
     
    25562593    case InSelectInTableMode:
    25572594    case InSelectMode:
    2558         ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode || insertionMode() == InTableBodyMode);
     2595        ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode || insertionMode() == InTableBodyMode || insertionMode() == InColumnGroupMode);
    25592596        if (m_tree.currentNode() != m_tree.openElements()->rootNode())
    25602597            parseError(token);
    2561         break;
    2562     case InColumnGroupMode:
    2563         if (m_tree.currentIsRootNode()) {
    2564             ASSERT(isParsingFragment());
    2565             return; // FIXME: Should we break here instead of returning?
    2566         }
    2567         if (!processColgroupEndTagForInColumnGroup()) {
    2568             ASSERT(isParsingFragmentOrTemplateContents());
    2569             return; // FIXME: Should we break here instead of returning?
    2570         }
    2571         processEndOfFile(token);
    2572         return;
     2598
     2599#if ENABLE(TEMPLATE_ELEMENT)
     2600        if (popAllTemplatesForEndOfFile()) {
     2601            processEndOfFile(token);
     2602            return;
     2603        }
     2604#endif
     2605        break;
    25732606    case InTableTextMode:
    25742607        defaultForInTableText();
     
    25852618        return;
    25862619    case TemplateContentsMode:
    2587         if (m_tree.currentIsRootNode()) {
    2588             ASSERT(isParsingFragment());
    2589             break;
    2590         }
     2620#if ENABLE(TEMPLATE_ELEMENT)
    25912621        parseError(token);
    2592         m_tree.openElements()->pop();
    2593         resetInsertionModeAppropriately();
    2594         processEndOfFile(token);
    2595         return;
     2622        if (popAllTemplatesForEndOfFile()) {
     2623            processEndOfFile(token);
     2624            return;
     2625        }
     2626        break;
     2627#else
     2628        ASSERT_NOT_REACHED();
     2629#endif
    25962630    }
    25972631    ASSERT(m_tree.currentNode());
  • trunk/Source/WebCore/html/parser/HTMLTreeBuilder.h

    r139523 r142531  
    196196    void processTemplateStartTag(AtomicHTMLToken*);
    197197    void processTemplateEndTag(AtomicHTMLToken*);
     198    bool popAllTemplatesForEndOfFile();
    198199#endif
    199200
Note: See TracChangeset for help on using the changeset viewer.