1/*
2 * Copyright (C) 2009 Alex Milowski (alex@milowski.com). All rights reserved.
3 * Copyright (C) 2010 Apple Inc. All rights reserved.
4 * Copyright (C) 2010 François Sausset (sausset@gmail.com). All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "config.h"
29
30#if ENABLE(MATHML)
31
32#include "MathMLElement.h"
33
34#include "MathMLNames.h"
35#include "RenderObject.h"
36#include "RenderTableCell.h"
37
38namespace WebCore {
39
40using namespace MathMLNames;
41
42MathMLElement::MathMLElement(const QualifiedName& tagName, Document* document)
43    : StyledElement(tagName, document, CreateStyledElement)
44{
45}
46
47PassRefPtr<MathMLElement> MathMLElement::create(const QualifiedName& tagName, Document* document)
48{
49    return adoptRef(new MathMLElement(tagName, document));
50}
51
52int MathMLElement::colSpan() const
53{
54    if (!hasTagName(mtdTag))
55        return 1;
56    const AtomicString& colSpanValue = fastGetAttribute(columnspanAttr);
57    return std::max(1, colSpanValue.toInt());
58}
59
60int MathMLElement::rowSpan() const
61{
62    if (!hasTagName(mtdTag))
63        return 1;
64    const AtomicString& rowSpanValue = fastGetAttribute(rowspanAttr);
65    return std::max(1, rowSpanValue.toInt());
66}
67
68void MathMLElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
69{
70    if (name == rowspanAttr) {
71        if (renderer() && renderer()->isTableCell() && hasTagName(mtdTag))
72            toRenderTableCell(renderer())->colSpanOrRowSpanChanged();
73    } else if (name == columnspanAttr) {
74        if (renderer() && renderer()->isTableCell() && hasTagName(mtdTag))
75            toRenderTableCell(renderer())->colSpanOrRowSpanChanged();
76    } else
77        StyledElement::parseAttribute(name, value);
78}
79
80bool MathMLElement::isPresentationAttribute(const QualifiedName& name) const
81{
82    if (name == mathbackgroundAttr || name == mathsizeAttr || name == mathcolorAttr || name == fontsizeAttr || name == backgroundAttr || name == colorAttr || name == fontstyleAttr || name == fontweightAttr || name == fontfamilyAttr)
83        return true;
84    return StyledElement::isPresentationAttribute(name);
85}
86
87void MathMLElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
88{
89    if (name == mathbackgroundAttr)
90        addPropertyToPresentationAttributeStyle(style, CSSPropertyBackgroundColor, value);
91    else if (name == mathsizeAttr) {
92        // The following three values of mathsize are handled in WebCore/css/mathml.css
93        if (value != "normal" && value != "small" && value != "big")
94            addPropertyToPresentationAttributeStyle(style, CSSPropertyFontSize, value);
95    } else if (name == mathcolorAttr)
96        addPropertyToPresentationAttributeStyle(style, CSSPropertyColor, value);
97    // FIXME: deprecated attributes that should loose in a conflict with a non deprecated attribute
98    else if (name == fontsizeAttr)
99        addPropertyToPresentationAttributeStyle(style, CSSPropertyFontSize, value);
100    else if (name == backgroundAttr)
101        addPropertyToPresentationAttributeStyle(style, CSSPropertyBackgroundColor, value);
102    else if (name == colorAttr)
103        addPropertyToPresentationAttributeStyle(style, CSSPropertyColor, value);
104    else if (name == fontstyleAttr)
105        addPropertyToPresentationAttributeStyle(style, CSSPropertyFontStyle, value);
106    else if (name == fontweightAttr)
107        addPropertyToPresentationAttributeStyle(style, CSSPropertyFontWeight, value);
108    else if (name == fontfamilyAttr)
109        addPropertyToPresentationAttributeStyle(style, CSSPropertyFontFamily, value);
110    else {
111        ASSERT(!isPresentationAttribute(name));
112        StyledElement::collectStyleForPresentationAttribute(name, value
113        , style);
114    }
115}
116
117}
118
119#endif // ENABLE(MATHML)
120