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 Apple Inc. All rights reserved. | 3 * Copyright (C) 2011 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 951 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
962 return; | 962 return; |
963 } | 963 } |
964 m_tree.generateImpliedEndTags(); | 964 m_tree.generateImpliedEndTags(); |
965 if (!m_tree.currentStackItem()->hasLocalName(token->name())) | 965 if (!m_tree.currentStackItem()->hasLocalName(token->name())) |
966 parseError(token); | 966 parseError(token); |
967 m_tree.openElements()->popUntilPopped(token->name()); | 967 m_tree.openElements()->popUntilPopped(token->name()); |
968 m_tree.activeFormattingElements()->clearToLastMarker(); | 968 m_tree.activeFormattingElements()->clearToLastMarker(); |
969 m_templateInsertionModes.removeLast(); | 969 m_templateInsertionModes.removeLast(); |
970 resetInsertionModeAppropriately(); | 970 resetInsertionModeAppropriately(); |
971 } | 971 } |
| 972 |
| 973 bool 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 } |
972 #endif | 989 #endif |
973 | 990 |
974 bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup() | 991 bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup() |
975 { | 992 { |
976 if (m_tree.currentIsRootNode() || m_tree.currentNode()->hasTagName(templateT
ag)) { | 993 bool ignoreFakeEndTag = m_tree.currentIsRootNode(); |
| 994 #if ENABLE(TEMPLATE_ELEMENT) |
| 995 ignoreFakeEndTag = ignoreFakeEndTag || m_tree.currentNode()->hasTagName(temp
lateTag); |
| 996 #endif |
| 997 |
| 998 if (ignoreFakeEndTag) { |
977 ASSERT(isParsingFragmentOrTemplateContents()); | 999 ASSERT(isParsingFragmentOrTemplateContents()); |
978 // FIXME: parse error | 1000 // FIXME: parse error |
979 return false; | 1001 return false; |
980 } | 1002 } |
981 m_tree.openElements()->pop(); | 1003 m_tree.openElements()->pop(); |
982 setInsertionMode(InTableMode); | 1004 setInsertionMode(InTableMode); |
983 return true; | 1005 return true; |
984 } | 1006 } |
985 | 1007 |
986 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html
#close-the-cell | 1008 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html
#close-the-cell |
(...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2494 m_tree.reconstructTheActiveFormattingElements(); | 2516 m_tree.reconstructTheActiveFormattingElements(); |
2495 String characters = buffer.takeRemaining(); | 2517 String characters = buffer.takeRemaining(); |
2496 m_tree.insertTextNode(characters); | 2518 m_tree.insertTextNode(characters); |
2497 if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters)) | 2519 if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters)) |
2498 m_framesetOk = false; | 2520 m_framesetOk = false; |
2499 } | 2521 } |
2500 | 2522 |
2501 void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken* token) | 2523 void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken* token) |
2502 { | 2524 { |
2503 ASSERT(token->type() == HTMLTokenTypes::EndOfFile); | 2525 ASSERT(token->type() == HTMLTokenTypes::EndOfFile); |
2504 #if ENABLE(TEMPLATE_ELEMENT) | |
2505 m_templateInsertionModes.clear(); | |
2506 #endif | |
2507 switch (insertionMode()) { | 2526 switch (insertionMode()) { |
2508 case InitialMode: | 2527 case InitialMode: |
2509 ASSERT(insertionMode() == InitialMode); | 2528 ASSERT(insertionMode() == InitialMode); |
2510 defaultForInitial(); | 2529 defaultForInitial(); |
2511 // Fall through. | 2530 // Fall through. |
2512 case BeforeHTMLMode: | 2531 case BeforeHTMLMode: |
2513 ASSERT(insertionMode() == BeforeHTMLMode); | 2532 ASSERT(insertionMode() == BeforeHTMLMode); |
2514 defaultForBeforeHTML(); | 2533 defaultForBeforeHTML(); |
2515 // Fall through. | 2534 // Fall through. |
2516 case BeforeHeadMode: | 2535 case BeforeHeadMode: |
(...skipping 12 matching lines...) Expand all Loading... |
2529 case InCellMode: | 2548 case InCellMode: |
2530 case InCaptionMode: | 2549 case InCaptionMode: |
2531 case InRowMode: | 2550 case InRowMode: |
2532 #if ENABLE(TEMPLATE_ELEMENT) | 2551 #if ENABLE(TEMPLATE_ELEMENT) |
2533 ASSERT(insertionMode() == InBodyMode || insertionMode() == InCellMode ||
insertionMode() == InCaptionMode || insertionMode() == InRowMode || insertionMo
de() == TemplateContentsMode); | 2552 ASSERT(insertionMode() == InBodyMode || insertionMode() == InCellMode ||
insertionMode() == InCaptionMode || insertionMode() == InRowMode || insertionMo
de() == TemplateContentsMode); |
2534 #else | 2553 #else |
2535 ASSERT(insertionMode() != TemplateContentsMode); | 2554 ASSERT(insertionMode() != TemplateContentsMode); |
2536 ASSERT(insertionMode() == InBodyMode || insertionMode() == InCellMode ||
insertionMode() == InCaptionMode || insertionMode() == InRowMode); | 2555 ASSERT(insertionMode() == InBodyMode || insertionMode() == InCellMode ||
insertionMode() == InCaptionMode || insertionMode() == InRowMode); |
2537 #endif | 2556 #endif |
2538 notImplemented(); // Emit parse error based on what elements are still o
pen. | 2557 notImplemented(); // Emit parse error based on what elements are still o
pen. |
| 2558 #if ENABLE(TEMPLATE_ELEMENT) |
| 2559 if (popAllTemplatesForEndOfFile()) { |
| 2560 processEndOfFile(token); |
| 2561 return; |
| 2562 } |
| 2563 #endif |
2539 break; | 2564 break; |
2540 case AfterBodyMode: | 2565 case AfterBodyMode: |
2541 case AfterAfterBodyMode: | 2566 case AfterAfterBodyMode: |
2542 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfter
BodyMode); | 2567 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfter
BodyMode); |
2543 break; | 2568 break; |
2544 case InHeadNoscriptMode: | 2569 case InHeadNoscriptMode: |
2545 ASSERT(insertionMode() == InHeadNoscriptMode); | 2570 ASSERT(insertionMode() == InHeadNoscriptMode); |
2546 defaultForInHeadNoscript(); | 2571 defaultForInHeadNoscript(); |
2547 processEndOfFile(token); | 2572 processEndOfFile(token); |
2548 return; | 2573 return; |
2549 case AfterFramesetMode: | 2574 case AfterFramesetMode: |
2550 case AfterAfterFramesetMode: | 2575 case AfterAfterFramesetMode: |
2551 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterA
fterFramesetMode); | 2576 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterA
fterFramesetMode); |
2552 break; | 2577 break; |
2553 case InFramesetMode: | |
2554 case InTableMode: | |
2555 case InTableBodyMode: | |
2556 case InSelectInTableMode: | |
2557 case InSelectMode: | |
2558 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode
|| insertionMode() == InTableBodyMode); | |
2559 if (m_tree.currentNode() != m_tree.openElements()->rootNode()) | |
2560 parseError(token); | |
2561 break; | |
2562 case InColumnGroupMode: | 2578 case InColumnGroupMode: |
2563 if (m_tree.currentIsRootNode()) { | 2579 if (m_tree.currentIsRootNode()) { |
2564 ASSERT(isParsingFragment()); | 2580 ASSERT(isParsingFragment()); |
2565 return; // FIXME: Should we break here instead of returning? | 2581 return; // FIXME: Should we break here instead of returning? |
2566 } | 2582 } |
2567 if (!processColgroupEndTagForInColumnGroup()) { | 2583 #if ENABLE(TEMPLATE_ELEMENT) |
2568 ASSERT(isParsingFragmentOrTemplateContents()); | 2584 ASSERT(m_tree.currentNode()->hasTagName(colgroupTag) || m_tree.currentNo
de()->hasTagName(templateTag)); |
2569 return; // FIXME: Should we break here instead of returning? | 2585 #else |
| 2586 ASSERT(m_tree.currentNode()->hasTagName(colgroupTag)); |
| 2587 #endif |
| 2588 processColgroupEndTagForInColumnGroup(); |
| 2589 // Fall through |
| 2590 case InFramesetMode: |
| 2591 case InTableMode: |
| 2592 case InTableBodyMode: |
| 2593 case InSelectInTableMode: |
| 2594 case InSelectMode: |
| 2595 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode
|| insertionMode() == InTableBodyMode || insertionMode() == InColumnGroupMode); |
| 2596 if (m_tree.currentNode() != m_tree.openElements()->rootNode()) |
| 2597 parseError(token); |
| 2598 |
| 2599 #if ENABLE(TEMPLATE_ELEMENT) |
| 2600 if (popAllTemplatesForEndOfFile()) { |
| 2601 processEndOfFile(token); |
| 2602 return; |
2570 } | 2603 } |
2571 processEndOfFile(token); | 2604 #endif |
2572 return; | 2605 break; |
2573 case InTableTextMode: | 2606 case InTableTextMode: |
2574 defaultForInTableText(); | 2607 defaultForInTableText(); |
2575 processEndOfFile(token); | 2608 processEndOfFile(token); |
2576 return; | 2609 return; |
2577 case TextMode: | 2610 case TextMode: |
2578 parseError(token); | 2611 parseError(token); |
2579 if (m_tree.currentStackItem()->hasTagName(scriptTag)) | 2612 if (m_tree.currentStackItem()->hasTagName(scriptTag)) |
2580 notImplemented(); // mark the script element as "already started". | 2613 notImplemented(); // mark the script element as "already started". |
2581 m_tree.openElements()->pop(); | 2614 m_tree.openElements()->pop(); |
2582 ASSERT(m_originalInsertionMode != TextMode); | 2615 ASSERT(m_originalInsertionMode != TextMode); |
2583 setInsertionMode(m_originalInsertionMode); | 2616 setInsertionMode(m_originalInsertionMode); |
2584 processEndOfFile(token); | 2617 processEndOfFile(token); |
2585 return; | 2618 return; |
2586 case TemplateContentsMode: | 2619 case TemplateContentsMode: |
2587 if (m_tree.currentIsRootNode()) { | 2620 #if ENABLE(TEMPLATE_ELEMENT) |
2588 ASSERT(isParsingFragment()); | 2621 parseError(token); |
2589 break; | 2622 if (popAllTemplatesForEndOfFile()) { |
| 2623 processEndOfFile(token); |
| 2624 return; |
2590 } | 2625 } |
2591 parseError(token); | 2626 break; |
2592 m_tree.openElements()->pop(); | 2627 #else |
2593 resetInsertionModeAppropriately(); | 2628 ASSERT_NOT_REACHED(); |
2594 processEndOfFile(token); | 2629 #endif |
2595 return; | |
2596 } | 2630 } |
2597 ASSERT(m_tree.currentNode()); | 2631 ASSERT(m_tree.currentNode()); |
2598 m_tree.openElements()->popAll(); | 2632 m_tree.openElements()->popAll(); |
2599 } | 2633 } |
2600 | 2634 |
2601 void HTMLTreeBuilder::defaultForInitial() | 2635 void HTMLTreeBuilder::defaultForInitial() |
2602 { | 2636 { |
2603 notImplemented(); | 2637 notImplemented(); |
2604 m_tree.setDefaultCompatibilityMode(); | 2638 m_tree.setDefaultCompatibilityMode(); |
2605 // FIXME: parse error | 2639 // FIXME: parse error |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2897 ASSERT(m_isAttached); | 2931 ASSERT(m_isAttached); |
2898 // Warning, this may detach the parser. Do not do anything else after this. | 2932 // Warning, this may detach the parser. Do not do anything else after this. |
2899 m_tree.finishedParsing(); | 2933 m_tree.finishedParsing(); |
2900 } | 2934 } |
2901 | 2935 |
2902 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) | 2936 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) |
2903 { | 2937 { |
2904 } | 2938 } |
2905 | 2939 |
2906 } | 2940 } |
OLD | NEW |