diff options
Diffstat (limited to 'WebCore/css')
-rw-r--r-- | WebCore/css/CSSComputedStyleDeclaration.cpp | 8 | ||||
-rw-r--r-- | WebCore/css/CSSFontFaceSource.cpp | 13 | ||||
-rw-r--r-- | WebCore/css/CSSFontSelector.h | 3 | ||||
-rw-r--r-- | WebCore/css/CSSHelper.h | 4 | ||||
-rw-r--r-- | WebCore/css/CSSOMUtils.h | 3 | ||||
-rw-r--r-- | WebCore/css/CSSParser.cpp | 5 | ||||
-rw-r--r-- | WebCore/css/CSSPrimitiveValue.h | 2 | ||||
-rw-r--r-- | WebCore/css/CSSPropertyNames.in | 1 | ||||
-rw-r--r-- | WebCore/css/CSSSelector.cpp | 15 | ||||
-rw-r--r-- | WebCore/css/CSSStyleSelector.cpp | 16 | ||||
-rw-r--r-- | WebCore/css/MediaList.h | 2 | ||||
-rw-r--r-- | WebCore/css/SVGCSSComputedStyleDeclaration.cpp | 23 | ||||
-rw-r--r-- | WebCore/css/SVGCSSStyleSelector.cpp | 26 | ||||
-rw-r--r-- | WebCore/css/StyleBase.h | 2 | ||||
-rw-r--r-- | WebCore/css/StyleMedia.cpp | 3 | ||||
-rw-r--r-- | WebCore/css/StyleSheetList.h | 2 | ||||
-rw-r--r-- | WebCore/css/WebKitCSSKeyframesRule.h | 2 | ||||
-rw-r--r-- | WebCore/css/mathml.css | 46 |
18 files changed, 128 insertions, 48 deletions
diff --git a/WebCore/css/CSSComputedStyleDeclaration.cpp b/WebCore/css/CSSComputedStyleDeclaration.cpp index 44ff1fc..6bb025d 100644 --- a/WebCore/css/CSSComputedStyleDeclaration.cpp +++ b/WebCore/css/CSSComputedStyleDeclaration.cpp @@ -925,9 +925,13 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int proper case CSSPropertyWebkitHyphens: return CSSPrimitiveValue::create(style->hyphens()); case CSSPropertyWebkitHyphenateCharacter: - if (style->hyphenateCharacter().isNull()) + if (style->hyphenationString().isNull()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); - return CSSPrimitiveValue::create(style->hyphenateCharacter(), CSSPrimitiveValue::CSS_STRING); + return CSSPrimitiveValue::create(style->hyphenationString(), CSSPrimitiveValue::CSS_STRING); + case CSSPropertyWebkitHyphenateLocale: + if (style->hyphenationLocale().isNull()) + return CSSPrimitiveValue::createIdentifier(CSSValueAuto); + return CSSPrimitiveValue::create(style->hyphenationLocale(), CSSPrimitiveValue::CSS_STRING); case CSSPropertyWebkitBorderFit: if (style->borderFit() == BorderFitBorder) return CSSPrimitiveValue::createIdentifier(CSSValueBorder); diff --git a/WebCore/css/CSSFontFaceSource.cpp b/WebCore/css/CSSFontFaceSource.cpp index 00dfcba..01b5569 100644 --- a/WebCore/css/CSSFontFaceSource.cpp +++ b/WebCore/css/CSSFontFaceSource.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -36,9 +36,7 @@ #include "SimpleFontData.h" #if ENABLE(SVG_FONTS) -#if !PLATFORM(WX) #include "FontCustomPlatformData.h" -#endif #include "HTMLNames.h" #include "SVGFontData.h" #include "SVGFontElement.h" @@ -155,8 +153,7 @@ SimpleFontData* CSSFontFaceSource::getFontData(const FontDescription& fontDescri m_svgFontFaceElement = fontFaceElement; } - SVGFontData* svgFontData = new SVGFontData(fontFaceElement); - fontData.set(new SimpleFontData(m_font->platformDataFromCustomData(fontDescription.computedPixelSize(), syntheticBold, syntheticItalic, fontDescription.renderingMode()), true, false, svgFontData)); + fontData.set(new SimpleFontData(adoptPtr(new SVGFontData(fontFaceElement)), fontDescription.computedPixelSize(), syntheticBold, syntheticItalic)); } } else #endif @@ -170,10 +167,8 @@ SimpleFontData* CSSFontFaceSource::getFontData(const FontDescription& fontDescri } else { #if ENABLE(SVG_FONTS) // In-Document SVG Fonts - if (m_svgFontFaceElement) { - SVGFontData* svgFontData = new SVGFontData(m_svgFontFaceElement); - fontData.set(new SimpleFontData(FontPlatformData(fontDescription.computedPixelSize(), syntheticBold, syntheticItalic), true, false, svgFontData)); - } + if (m_svgFontFaceElement) + fontData.set(new SimpleFontData(adoptPtr(new SVGFontData(m_svgFontFaceElement)), fontDescription.computedPixelSize(), syntheticBold, syntheticItalic)); #endif } } else { diff --git a/WebCore/css/CSSFontSelector.h b/WebCore/css/CSSFontSelector.h index af454bd..d9cce1c 100644 --- a/WebCore/css/CSSFontSelector.h +++ b/WebCore/css/CSSFontSelector.h @@ -28,19 +28,18 @@ #include "FontSelector.h" #include "StringHash.h" +#include <wtf/Forward.h> #include <wtf/HashMap.h> #include <wtf/RefPtr.h> namespace WebCore { -class AtomicString; class CSSFontFace; class CSSFontFaceRule; class CSSSegmentedFontFace; class Document; class DocLoader; class FontDescription; -class String; class CSSFontSelector : public FontSelector { public: diff --git a/WebCore/css/CSSHelper.h b/WebCore/css/CSSHelper.h index 2e33377..331815e 100644 --- a/WebCore/css/CSSHelper.h +++ b/WebCore/css/CSSHelper.h @@ -22,9 +22,9 @@ #ifndef CSSHelper_h #define CSSHelper_h -namespace WebCore { +#include <wtf/Forward.h> - class String; +namespace WebCore { // Used in many inappropriate contexts throughout WebCore. We'll have to examine and test // each call site to find out whether it needs the various things this function does. That diff --git a/WebCore/css/CSSOMUtils.h b/WebCore/css/CSSOMUtils.h index 6602b35..749cb25 100644 --- a/WebCore/css/CSSOMUtils.h +++ b/WebCore/css/CSSOMUtils.h @@ -31,6 +31,7 @@ #ifndef CSSOMUtils_h #define CSSOMUtils_h +#include <wtf/Forward.h> #include <wtf/Vector.h> #include <wtf/unicode/Unicode.h> @@ -38,8 +39,6 @@ namespace WebCore { -class String; - // Common serializing methods. See: http://dev.w3.org/csswg/cssom/#common-serializing-idioms void serializeCharacter(UChar32, Vector<UChar>& appendTo); void serializeCharacterAsCodePoint(UChar32, Vector<UChar>& appendTo); diff --git a/WebCore/css/CSSParser.cpp b/WebCore/css/CSSParser.cpp index 645e354..a084474 100644 --- a/WebCore/css/CSSParser.cpp +++ b/WebCore/css/CSSParser.cpp @@ -1628,6 +1628,11 @@ bool CSSParser::parseValue(int propId, bool important) validPrimitive = true; break; + case CSSPropertyWebkitHyphenateLocale: + if (id == CSSValueAuto || value->unit == CSSPrimitiveValue::CSS_STRING) + validPrimitive = true; + break; + case CSSPropertyWebkitBorderFit: if (id == CSSValueBorder || id == CSSValueLines) validPrimitive = true; diff --git a/WebCore/css/CSSPrimitiveValue.h b/WebCore/css/CSSPrimitiveValue.h index a71c8c6..b11c7f0 100644 --- a/WebCore/css/CSSPrimitiveValue.h +++ b/WebCore/css/CSSPrimitiveValue.h @@ -24,6 +24,7 @@ #include "CSSValue.h" #include "Color.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> namespace WebCore { @@ -34,7 +35,6 @@ class Pair; class RGBColor; class Rect; class RenderStyle; -class StringImpl; struct Length; diff --git a/WebCore/css/CSSPropertyNames.in b/WebCore/css/CSSPropertyNames.in index 44216e0..1a79602 100644 --- a/WebCore/css/CSSPropertyNames.in +++ b/WebCore/css/CSSPropertyNames.in @@ -217,6 +217,7 @@ z-index -webkit-font-smoothing -webkit-highlight -webkit-hyphenate-character +-webkit-hyphenate-locale -webkit-hyphens -webkit-line-break -webkit-line-clamp diff --git a/WebCore/css/CSSSelector.cpp b/WebCore/css/CSSSelector.cpp index facce83..03974d9 100644 --- a/WebCore/css/CSSSelector.cpp +++ b/WebCore/css/CSSSelector.cpp @@ -34,7 +34,7 @@ #include <wtf/Vector.h> namespace WebCore { - + using namespace HTMLNames; class CSSSelectorBag : public Noncopyable { @@ -713,8 +713,11 @@ String CSSSelector::selectorText() const if (m_match == CSSSelector::None || !prefix.isNull() || localName != starAtom) { if (prefix.isNull()) str = localName; - else - str = prefix + "|" + localName; + else { + str = prefix.string(); + str.append("|"); + str.append(localName); + } } const CSSSelector* cs = this; @@ -746,8 +749,10 @@ String CSSSelector::selectorText() const } else if (cs->hasAttribute()) { str += "["; const AtomicString& prefix = cs->attribute().prefix(); - if (!prefix.isNull()) - str += prefix + "|"; + if (!prefix.isNull()) { + str.append(prefix); + str.append("|"); + } str += cs->attribute().localName(); switch (cs->m_match) { case CSSSelector::Exact: diff --git a/WebCore/css/CSSStyleSelector.cpp b/WebCore/css/CSSStyleSelector.cpp index 6f64235..40b11d9 100644 --- a/WebCore/css/CSSStyleSelector.cpp +++ b/WebCore/css/CSSStyleSelector.cpp @@ -2517,7 +2517,7 @@ bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Eleme break; } case CSSSelector::PseudoFocus: - if (e && e->focused() && e->document()->frame()->selection()->isFocusedAndActive()) + if (e && e->focused() && e->document()->frame() && e->document()->frame()->selection()->isFocusedAndActive()) return true; break; case CSSSelector::PseudoHover: { @@ -5215,11 +5215,19 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value) return; } case CSSPropertyWebkitHyphenateCharacter: { - HANDLE_INHERIT_AND_INITIAL(hyphenateCharacter, HyphenateCharacter); + HANDLE_INHERIT_AND_INITIAL(hyphenationString, HyphenationString); if (primitiveValue->getIdent() == CSSValueAuto) - m_style->setHyphenateCharacter(nullAtom); + m_style->setHyphenationString(nullAtom); else - m_style->setHyphenateCharacter(primitiveValue->getStringValue()); + m_style->setHyphenationString(primitiveValue->getStringValue()); + return; + } + case CSSPropertyWebkitHyphenateLocale: { + HANDLE_INHERIT_AND_INITIAL(hyphenationLocale, HyphenationLocale); + if (primitiveValue->getIdent() == CSSValueAuto) + m_style->setHyphenationLocale(nullAtom); + else + m_style->setHyphenationLocale(primitiveValue->getStringValue()); return; } case CSSPropertyWebkitBorderFit: { diff --git a/WebCore/css/MediaList.h b/WebCore/css/MediaList.h index f1eb0c0..e91ca9d 100644 --- a/WebCore/css/MediaList.h +++ b/WebCore/css/MediaList.h @@ -22,6 +22,7 @@ #define MediaList_h #include "StyleBase.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/Vector.h> @@ -30,7 +31,6 @@ namespace WebCore { class CSSImportRule; class CSSStyleSheet; class MediaQuery; -class String; typedef int ExceptionCode; diff --git a/WebCore/css/SVGCSSComputedStyleDeclaration.cpp b/WebCore/css/SVGCSSComputedStyleDeclaration.cpp index 00cb308..410eede 100644 --- a/WebCore/css/SVGCSSComputedStyleDeclaration.cpp +++ b/WebCore/css/SVGCSSComputedStyleDeclaration.cpp @@ -46,6 +46,19 @@ static PassRefPtr<CSSPrimitiveValue> glyphOrientationToCSSPrimitiveValue(EGlyphO } } +static PassRefPtr<CSSValue> strokeDashArrayToCSSValueList(const Vector<SVGLength>& dashes) +{ + if (dashes.isEmpty()) + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + + RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); + const Vector<SVGLength>::const_iterator end = dashes.end(); + for (Vector<SVGLength>::const_iterator it = dashes.begin(); it != end; ++it) + list->append(SVGLength::toCSSPrimitiveValue(*it)); + + return list.release(); +} + PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getSVGPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const { Node* node = m_node.get(); @@ -122,7 +135,7 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getSVGPropertyCSSValue(int pro case CSSPropertyFill: return svgStyle->fillPaint(); case CSSPropertyKerning: - return svgStyle->kerning(); + return SVGLength::toCSSPrimitiveValue(svgStyle->kerning()); case CSSPropertyMarkerEnd: if (!svgStyle->markerEndResource().isEmpty()) return CSSPrimitiveValue::create(svgStyle->markerEndResource(), CSSPrimitiveValue::CSS_URI); @@ -138,11 +151,11 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getSVGPropertyCSSValue(int pro case CSSPropertyStroke: return svgStyle->strokePaint(); case CSSPropertyStrokeDasharray: - return svgStyle->strokeDashArray(); + return strokeDashArrayToCSSValueList(svgStyle->strokeDashArray()); case CSSPropertyStrokeDashoffset: - return svgStyle->strokeDashOffset(); + return SVGLength::toCSSPrimitiveValue(svgStyle->strokeDashOffset()); case CSSPropertyStrokeWidth: - return svgStyle->strokeWidth(); + return SVGLength::toCSSPrimitiveValue(svgStyle->strokeWidth()); case CSSPropertyBaselineShift: { switch (svgStyle->baselineShift()) { case BS_BASELINE: @@ -152,7 +165,7 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getSVGPropertyCSSValue(int pro case BS_SUB: return CSSPrimitiveValue::createIdentifier(CSSValueSub); case BS_LENGTH: - return svgStyle->baselineShiftValue(); + return SVGLength::toCSSPrimitiveValue(svgStyle->baselineShiftValue()); } } case CSSPropertyGlyphOrientationHorizontal: diff --git a/WebCore/css/SVGCSSStyleSelector.cpp b/WebCore/css/SVGCSSStyleSelector.cpp index 3b38890..b8cc4f7 100644 --- a/WebCore/css/SVGCSSStyleSelector.cpp +++ b/WebCore/css/SVGCSSStyleSelector.cpp @@ -153,7 +153,7 @@ void CSSStyleSelector::applySVGProperty(int id, CSSValue* value) } } else { svgstyle->setBaselineShift(BS_LENGTH); - svgstyle->setBaselineShiftValue(primitiveValue); + svgstyle->setBaselineShiftValue(SVGLength::fromCSSPrimitiveValue(primitiveValue)); } break; @@ -161,7 +161,7 @@ void CSSStyleSelector::applySVGProperty(int id, CSSValue* value) case CSSPropertyKerning: { HANDLE_INHERIT_AND_INITIAL(kerning, Kerning); - svgstyle->setKerning(primitiveValue); + svgstyle->setKerning(SVGLength::fromCSSPrimitiveValue(primitiveValue)); break; } case CSSPropertyDominantBaseline: @@ -247,21 +247,35 @@ void CSSStyleSelector::applySVGProperty(int id, CSSValue* value) { HANDLE_INHERIT_AND_INITIAL(strokeWidth, StrokeWidth) if (primitiveValue) - svgstyle->setStrokeWidth(primitiveValue); + svgstyle->setStrokeWidth(SVGLength::fromCSSPrimitiveValue(primitiveValue)); break; } case CSSPropertyStrokeDasharray: { HANDLE_INHERIT_AND_INITIAL(strokeDashArray, StrokeDashArray) - if (value->isValueList()) - svgstyle->setStrokeDashArray(static_cast<CSSValueList*>(value)); + if (!value->isValueList()) + break; + + CSSValueList* dashes = static_cast<CSSValueList*>(value); + + Vector<SVGLength> array; + size_t length = dashes->length(); + for (size_t i = 0; i < length; ++i) { + CSSPrimitiveValue* dash = static_cast<CSSPrimitiveValue*>(dashes->itemWithoutBoundsCheck(i)); + if (!dash) + continue; + + array.append(SVGLength::fromCSSPrimitiveValue(dash)); + } + + svgstyle->setStrokeDashArray(array); break; } case CSSPropertyStrokeDashoffset: { HANDLE_INHERIT_AND_INITIAL(strokeDashOffset, StrokeDashOffset) if (primitiveValue) - svgstyle->setStrokeDashOffset(primitiveValue); + svgstyle->setStrokeDashOffset(SVGLength::fromCSSPrimitiveValue(primitiveValue)); break; } case CSSPropertyFillOpacity: diff --git a/WebCore/css/StyleBase.h b/WebCore/css/StyleBase.h index 521ee5d..a53b2c5 100644 --- a/WebCore/css/StyleBase.h +++ b/WebCore/css/StyleBase.h @@ -23,11 +23,11 @@ #ifndef StyleBase_h #define StyleBase_h +#include <wtf/Forward.h> #include <wtf/RefCounted.h> namespace WebCore { - class String; class StyleSheet; class KURL; diff --git a/WebCore/css/StyleMedia.cpp b/WebCore/css/StyleMedia.cpp index 6cb662f..8971d35 100644 --- a/WebCore/css/StyleMedia.cpp +++ b/WebCore/css/StyleMedia.cpp @@ -56,7 +56,8 @@ bool StyleMedia::matchMedium(const String& query) const Document* document = m_frame->document(); ASSERT(document); Element* documentElement = document->documentElement(); - ASSERT(documentElement); + if (!documentElement) + return false; CSSStyleSelector* styleSelector = document->styleSelector(); if (!styleSelector) diff --git a/WebCore/css/StyleSheetList.h b/WebCore/css/StyleSheetList.h index ecdc1cf..a486511 100644 --- a/WebCore/css/StyleSheetList.h +++ b/WebCore/css/StyleSheetList.h @@ -21,6 +21,7 @@ #ifndef StyleSheetList_h #define StyleSheetList_h +#include <wtf/Forward.h> #include <wtf/RefCounted.h> #include <wtf/PassRefPtr.h> #include <wtf/Vector.h> @@ -30,7 +31,6 @@ namespace WebCore { class Document; class HTMLStyleElement; class StyleSheet; -class String; typedef Vector<RefPtr<StyleSheet> > StyleSheetVector; diff --git a/WebCore/css/WebKitCSSKeyframesRule.h b/WebCore/css/WebKitCSSKeyframesRule.h index f58406f..2836942 100644 --- a/WebCore/css/WebKitCSSKeyframesRule.h +++ b/WebCore/css/WebKitCSSKeyframesRule.h @@ -27,6 +27,7 @@ #define WebKitCSSKeyframesRule_h #include "CSSRule.h" +#include <wtf/Forward.h> #include <wtf/RefPtr.h> #include "AtomicString.h" @@ -34,7 +35,6 @@ namespace WebCore { class CSSRuleList; class WebKitCSSKeyframeRule; -class String; typedef int ExceptionCode; diff --git a/WebCore/css/mathml.css b/WebCore/css/mathml.css index ca9d7b0..fd125c0 100644 --- a/WebCore/css/mathml.css +++ b/WebCore/css/mathml.css @@ -1,7 +1,7 @@ @namespace "http://www.w3.org/1998/Math/MathML"; math { - font-family: Symbol, "Times New Roman"; + font-family: STIXGeneral, Symbol, "Times New Roman", sans-serif; display: inline-block; padding: 0px; margin: 0px; @@ -29,7 +29,7 @@ mrow, mfenced { padding-right: 1px; } -mi{ +mi { font-style: italic; padding-right: 0.1em; } @@ -94,15 +94,35 @@ math > mo, mrow > mo, mfenced > mo { padding-right: 0.05em; } -math[mathsize="small"], mstyle[mathsize="small"], mo[mathsize="small"], mn[mathsize="small"], mi[mathsize="small"], mtext[mathsize="small"], mspace[mathsize="small"], ms[mathsize="small"]{ +math[mathvariant="normal"], mstyle[mathvariant="normal"], mo[mathvariant="normal"], mn[mathvariant="normal"], mi[mathvariant="normal"], mtext[mathvariant="normal"], mspace[mathvariant="normal"], ms[mathvariant="normal"] { + font-style: normal; + font-weight: normal; +} + +math[mathvariant="bold"], mstyle[mathvariant="bold"], mo[mathvariant="bold"], mn[mathvariant="bold"], mi[mathvariant="bold"], mtext[mathvariant="bold"], mspace[mathvariant="bold"], ms[mathvariant="bold"] { + font-style: normal; + font-weight: bold; +} + +math[mathvariant="italic"], mstyle[mathvariant="italic"], mo[mathvariant="italic"], mn[mathvariant="italic"], mi[mathvariant="italic"], mtext[mathvariant="italic"], mspace[mathvariant="italic"], ms[mathvariant="italic"] { + font-style: italic; + font-weight: normal; +} + +math[mathvariant="bold-italic"], mstyle[mathvariant="bold-italic"], mo[mathvariant="bold-italic"], mn[mathvariant="bold-italic"], mi[mathvariant="bold-italic"], mtext[mathvariant="bold-italic"], mspace[mathvariant="bold-italic"], ms[mathvariant="bold-italic"] { + font-weight: bold; + font-style: italic; +} + +math[mathsize="small"], mstyle[mathsize="small"], mo[mathsize="small"], mn[mathsize="small"], mi[mathsize="small"], mtext[mathsize="small"], mspace[mathsize="small"], ms[mathsize="small"] { font-size: 0.75em; } -math[mathsize="normal"], mstyle[mathsize="normal"], mo[mathsize="normal"], mn[mathsize="normal"], mi[mathsize="normal"], mtext[mathsize="normal"], mspace[mathsize="normal"], ms[mathsize="normal"]{ +math[mathsize="normal"], mstyle[mathsize="normal"], mo[mathsize="normal"], mn[mathsize="normal"], mi[mathsize="normal"], mtext[mathsize="normal"], mspace[mathsize="normal"], ms[mathsize="normal"] { font-size: 1em; } -math[mathsize="big"], mstyle[mathsize="big"], mo[mathsize="big"], mn[mathsize="big"], mi[mathsize="big"], mtext[mathsize="big"], mspace[mathsize="big"], ms[mathsize="big"]{ +math[mathsize="big"], mstyle[mathsize="big"], mo[mathsize="big"], mn[mathsize="big"], mi[mathsize="big"], mtext[mathsize="big"], mspace[mathsize="big"], ms[mathsize="big"] { font-size: 1.5em; } @@ -113,8 +133,12 @@ annotation, annotation-xml { mphantom { visibility: hidden; } + merror { outline: solid thin red; + font-weight: bold; + font-family: sans-serif; + background-color: lightYellow; } msqrt { @@ -149,9 +173,11 @@ mtable { text-align: center; vertical-align: -40%; } + mtr { display: table-row; } + mtd { display: table-cell; padding: 0 0.5ex; @@ -164,33 +190,43 @@ mtable[columnalign="left"], mtr[columnalign="left"], mtd[columnalign="left"] { mtable[columnalign="right"], mtr[columnalign="right"], mtd[columnalign="right"] { text-align: right; } + mtable[rowalign="top"] mtd, mtable mtr[rowalign="top"] mtd, mtable mtr mtd[rowalign="top"] { vertical-align: top; } + mtable[rowalign="bottom"] mtd, mtable mtr[rowalign="bottom"] mtd, mtable mtr mtd[rowalign="bottom"] { vertical-align: bottom; } + mtable[rowalign="center"] mtd, mtable mtr[rowalign="center"] mtd, mtable mtr mtd[rowalign="center"] { vertical-align: middle; } + mtable[frame="solid"] { border: solid thin; } + mtable[frame="dashed"] { border: dashed thin; } + mtable[rowlines="solid"], mtable[rowlines="dashed"], mtable[columnlines="solid"], mtable[columnlines="dashed"] { border-collapse: collapse; } + mtable[rowlines="solid"] > mtr + mtr { border-top: solid thin; } + mtable[rowlines="dashed"] > mtr + mtr { border-top: dashed thin; } + mtable[columnlines="solid"] > mtr > mtd + mtd { border-left: solid thin; } + mtable[columnlines="dashed"] > mtr > mtd + mtd { border-left: dashed thin; } |