| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 { | 535 { |
| 536 // http://dev.w3.org/html5/webvtt/#webvtt-cue-text-dom-construction-rules | 536 // http://dev.w3.org/html5/webvtt/#webvtt-cue-text-dom-construction-rules |
| 537 | 537 |
| 538 switch (m_token.type()) { | 538 switch (m_token.type()) { |
| 539 case VTTTokenTypes::Character: { | 539 case VTTTokenTypes::Character: { |
| 540 RefPtr<Text> child = Text::create(document, m_token.characters()); | 540 RefPtr<Text> child = Text::create(document, m_token.characters()); |
| 541 m_currentNode->parserAppendChild(child); | 541 m_currentNode->parserAppendChild(child); |
| 542 break; | 542 break; |
| 543 } | 543 } |
| 544 case VTTTokenTypes::StartTag: { | 544 case VTTTokenTypes::StartTag: { |
| 545 RefPtr<VTTElement> child; | |
| 546 VTTNodeType nodeType = tokenToNodeType(m_token); | 545 VTTNodeType nodeType = tokenToNodeType(m_token); |
| 547 if (nodeType != VTTNodeTypeNone) | 546 if (nodeType == VTTNodeTypeNone) |
| 548 child = VTTElement::create(nodeType, &document); | 547 break; |
| 549 if (child) { | |
| 550 if (!m_token.classes().isEmpty()) | |
| 551 child->setAttribute(classAttr, m_token.classes()); | |
| 552 | 548 |
| 553 if (child->webVTTNodeType() == VTTNodeTypeVoice) { | 549 VTTNodeType currentType = m_currentNode->isVTTElement() ? toVTTElement(m
_currentNode.get())->webVTTNodeType() : VTTNodeTypeNone; |
| 554 child->setAttribute(VTTElement::voiceAttributeName(), m_token.an
notation()); | 550 // <rt> is only allowed if the current node is <ruby>. |
| 555 } else if (child->webVTTNodeType() == VTTNodeTypeLanguage) { | 551 if (nodeType == VTTNodeTypeRubyText && currentType != VTTNodeTypeRuby) |
| 556 m_languageStack.append(m_token.annotation()); | 552 break; |
| 557 child->setAttribute(VTTElement::langAttributeName(), m_languageS
tack.last()); | 553 |
| 558 } | 554 RefPtr<VTTElement> child = VTTElement::create(nodeType, &document); |
| 559 if (!m_languageStack.isEmpty()) | 555 if (!m_token.classes().isEmpty()) |
| 560 child->setLanguage(m_languageStack.last()); | 556 child->setAttribute(classAttr, m_token.classes()); |
| 561 m_currentNode->parserAppendChild(child); | 557 |
| 562 m_currentNode = child; | 558 if (nodeType == VTTNodeTypeVoice) { |
| 559 child->setAttribute(VTTElement::voiceAttributeName(), m_token.annota
tion()); |
| 560 } else if (nodeType == VTTNodeTypeLanguage) { |
| 561 m_languageStack.append(m_token.annotation()); |
| 562 child->setAttribute(VTTElement::langAttributeName(), m_languageStack
.last()); |
| 563 } | 563 } |
| 564 if (!m_languageStack.isEmpty()) |
| 565 child->setLanguage(m_languageStack.last()); |
| 566 m_currentNode->parserAppendChild(child); |
| 567 m_currentNode = child; |
| 564 break; | 568 break; |
| 565 } | 569 } |
| 566 case VTTTokenTypes::EndTag: { | 570 case VTTTokenTypes::EndTag: { |
| 567 VTTNodeType nodeType = tokenToNodeType(m_token); | 571 VTTNodeType nodeType = tokenToNodeType(m_token); |
| 568 if (nodeType == VTTNodeTypeNone) | 572 if (nodeType == VTTNodeTypeNone) |
| 569 break; | 573 break; |
| 570 | 574 |
| 571 // The only non-VTTElement would be the DocumentFragment root. (Text | 575 // The only non-VTTElement would be the DocumentFragment root. (Text |
| 572 // nodes and PIs will never appear as m_currentNode.) | 576 // nodes and PIs will never appear as m_currentNode.) |
| 573 if (!m_currentNode->isVTTElement()) | 577 if (!m_currentNode->isVTTElement()) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 604 } | 608 } |
| 605 | 609 |
| 606 void VTTParser::skipWhiteSpace(const String& line, unsigned* position) | 610 void VTTParser::skipWhiteSpace(const String& line, unsigned* position) |
| 607 { | 611 { |
| 608 while (*position < line.length() && isASpace(line[*position])) | 612 while (*position < line.length() && isASpace(line[*position])) |
| 609 (*position)++; | 613 (*position)++; |
| 610 } | 614 } |
| 611 | 615 |
| 612 } | 616 } |
| 613 | 617 |
| OLD | NEW |