f43403269f00addbe902276833e2a488b8170d78
[WebKit-https.git] / Source / WebCore / html / track / WebVTTElement.cpp
1 /*
2  * Copyright (C) 2013 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebVTTElement.h"
28
29 #if ENABLE(VIDEO_TRACK)
30
31 #include "HTMLSpanElement.h"
32 #include "RubyElement.h"
33 #include "RubyTextElement.h"
34 #include "TextTrack.h"
35
36 namespace WebCore {
37
38 static const QualifiedName& nodeTypeToTagName(WebVTTNodeType nodeType)
39 {
40     static NeverDestroyed<QualifiedName> cTag(nullAtom, "c", nullAtom);
41     static NeverDestroyed<QualifiedName> vTag(nullAtom, "v", nullAtom);
42     static NeverDestroyed<QualifiedName> langTag(nullAtom, "lang", nullAtom);
43     static NeverDestroyed<QualifiedName> bTag(nullAtom, "b", nullAtom);
44     static NeverDestroyed<QualifiedName> uTag(nullAtom, "u", nullAtom);
45     static NeverDestroyed<QualifiedName> iTag(nullAtom, "i", nullAtom);
46     static NeverDestroyed<QualifiedName> rubyTag(nullAtom, "ruby", nullAtom);
47     static NeverDestroyed<QualifiedName> rtTag(nullAtom, "rt", nullAtom);
48     switch (nodeType) {
49     case WebVTTNodeTypeClass:
50         return cTag;
51     case WebVTTNodeTypeItalic:
52         return iTag;
53     case WebVTTNodeTypeLanguage:
54         return langTag;
55     case WebVTTNodeTypeBold:
56         return bTag;
57     case WebVTTNodeTypeUnderline:
58         return uTag;
59     case WebVTTNodeTypeRuby:
60         return rubyTag;
61     case WebVTTNodeTypeRubyText:
62         return rtTag;
63     case WebVTTNodeTypeVoice:
64         return vTag;
65     case WebVTTNodeTypeNone:
66     default:
67         ASSERT_NOT_REACHED();
68         return cTag; // Make the compiler happy.
69     }
70 }
71
72 WebVTTElement::WebVTTElement(WebVTTNodeType nodeType, Document& document)
73     : Element(nodeTypeToTagName(nodeType), document, CreateElement)
74     , m_isPastNode(0)
75     , m_webVTTNodeType(nodeType)
76 {
77 }
78
79 Ref<WebVTTElement> WebVTTElement::create(WebVTTNodeType nodeType, Document& document)
80 {
81     return adoptRef(*new WebVTTElement(nodeType, document));
82 }
83
84 Ref<Element> WebVTTElement::cloneElementWithoutAttributesAndChildren(Document& targetDocument)
85 {
86     Ref<WebVTTElement> clone = create(static_cast<WebVTTNodeType>(m_webVTTNodeType), targetDocument);
87     clone->setLanguage(m_language);
88     return WTFMove(clone);
89 }
90
91 Ref<HTMLElement> WebVTTElement::createEquivalentHTMLElement(Document& document)
92 {
93     RefPtr<HTMLElement> htmlElement;
94
95     switch (m_webVTTNodeType) {
96     case WebVTTNodeTypeClass:
97     case WebVTTNodeTypeLanguage:
98     case WebVTTNodeTypeVoice:
99         htmlElement = HTMLSpanElement::create(document);
100         htmlElement->setAttributeWithoutSynchronization(HTMLNames::titleAttr, attributeWithoutSynchronization(voiceAttributeName()));
101         htmlElement->setAttributeWithoutSynchronization(HTMLNames::langAttr, attributeWithoutSynchronization(langAttributeName()));
102         break;
103     case WebVTTNodeTypeItalic:
104         htmlElement = HTMLElement::create(HTMLNames::iTag, document);
105         break;
106     case WebVTTNodeTypeBold:
107         htmlElement = HTMLElement::create(HTMLNames::bTag, document);
108         break;
109     case WebVTTNodeTypeUnderline:
110         htmlElement = HTMLElement::create(HTMLNames::uTag, document);
111         break;
112     case WebVTTNodeTypeRuby:
113         htmlElement = RubyElement::create(document);
114         break;
115     case WebVTTNodeTypeRubyText:
116         htmlElement = RubyTextElement::create(document);
117         break;
118     }
119
120     ASSERT(htmlElement);
121     if (htmlElement)
122         htmlElement->setAttributeWithoutSynchronization(HTMLNames::classAttr, attributeWithoutSynchronization(HTMLNames::classAttr));
123     return htmlElement.releaseNonNull();
124 }
125
126 } // namespace WebCore
127
128 #endif