Bug 772321 - Implement CSS parsing of writing-mode r=dbaron

This commit is contained in:
Rick Eyre 2013-05-28 12:00:49 -04:00
parent 25c63a5905
commit 76072f4667
12 changed files with 67 additions and 1 deletions

View File

@ -364,6 +364,11 @@ static inline mozilla::css::Side operator++(mozilla::css::Side& side, int) {
#define NS_STYLE_DIRECTION_RTL 1
#define NS_STYLE_DIRECTION_INHERIT 2
// See nsStyleVisibility
#define NS_STYLE_WRITING_MODE_HORIZONTAL_TB 0
#define NS_STYLE_WRITING_MODE_VERTICAL_LR 1
#define NS_STYLE_WRITING_MODE_VERTICAL_RL 2
// See nsStyleDisplay
#define NS_STYLE_DISPLAY_NONE 0
#define NS_STYLE_DISPLAY_BLOCK 1

View File

@ -284,6 +284,7 @@ CSS_KEY(hiragana-iroha, hiragana_iroha)
CSS_KEY(historical-forms, historical_forms)
CSS_KEY(historical-ligatures, historical_ligatures)
CSS_KEY(horizontal, horizontal)
CSS_KEY(horizontal-tb, horizontal_tb)
CSS_KEY(hz, hz)
CSS_KEY(icon, icon)
CSS_KEY(ignore, ignore)
@ -506,6 +507,8 @@ CSS_KEY(upper-latin, upper_latin)
CSS_KEY(upper-roman, upper_roman)
CSS_KEY(uppercase, uppercase)
CSS_KEY(vertical, vertical)
CSS_KEY(vertical-lr, vertical_lr)
CSS_KEY(vertical-rl, vertical_rl)
CSS_KEY(vertical-text, vertical_text)
CSS_KEY(visible, visible)
CSS_KEY(visiblefill, visiblefill)

View File

@ -2621,6 +2621,16 @@ CSS_PROP_VISIBILITY(
kPointerEventsKTable,
offsetof(nsStyleVisibility, mPointerEvents),
eStyleAnimType_EnumU8)
CSS_PROP_VISIBILITY(
writing-mode,
writing_mode,
WritingMode,
CSS_PROPERTY_PARSE_VALUE,
"layout.css.vertical-text.enabled",
VARIANT_HK,
kWritingModeKTable,
offsetof(nsStyleVisibility, mWritingMode),
eStyleAnimType_EnumU8)
CSS_PROP_DISPLAY(
position,
position,

View File

@ -1570,6 +1570,13 @@ const int32_t nsCSSProps::kWordWrapKTable[] = {
eCSSKeyword_UNKNOWN,-1
};
const int32_t nsCSSProps::kWritingModeKTable[] = {
eCSSKeyword_horizontal_tb, NS_STYLE_WRITING_MODE_HORIZONTAL_TB,
eCSSKeyword_vertical_lr, NS_STYLE_WRITING_MODE_VERTICAL_LR,
eCSSKeyword_vertical_rl, NS_STYLE_WRITING_MODE_VERTICAL_RL,
eCSSKeyword_UNKNOWN, -1
};
const int32_t nsCSSProps::kHyphensKTable[] = {
eCSSKeyword_none, NS_STYLE_HYPHENS_NONE,
eCSSKeyword_manual, NS_STYLE_HYPHENS_MANUAL,

View File

@ -465,6 +465,7 @@ public:
static const int32_t kWindowShadowKTable[];
static const int32_t kWordBreakKTable[];
static const int32_t kWordWrapKTable[];
static const int32_t kWritingModeKTable[];
static const int32_t kHyphensKTable[];
};

View File

@ -2938,6 +2938,16 @@ nsComputedDOMStyle::DoGetVisibility()
return val;
}
CSSValue*
nsComputedDOMStyle::DoGetWritingMode()
{
nsROCSSPrimitiveValue* val = new nsROCSSPrimitiveValue;
val->SetIdent(
nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mWritingMode,
nsCSSProps::kWritingModeKTable));
return val;
}
CSSValue*
nsComputedDOMStyle::DoGetDirection()
{
@ -5000,6 +5010,7 @@ nsComputedDOMStyle::GetQueryablePropertyMap(uint32_t* aLength)
COMPUTED_STYLE_MAP_ENTRY(word_break, WordBreak),
COMPUTED_STYLE_MAP_ENTRY(word_spacing, WordSpacing),
COMPUTED_STYLE_MAP_ENTRY(word_wrap, WordWrap),
COMPUTED_STYLE_MAP_ENTRY(writing_mode, WritingMode),
COMPUTED_STYLE_MAP_ENTRY(z_index, ZIndex),
/* ******************************* *\

View File

@ -327,6 +327,7 @@ private:
mozilla::dom::CSSValue* DoGetOpacity();
mozilla::dom::CSSValue* DoGetPointerEvents();
mozilla::dom::CSSValue* DoGetVisibility();
mozilla::dom::CSSValue* DoGetWritingMode();
/* Direction properties */
mozilla::dom::CSSValue* DoGetDirection();

View File

@ -5243,6 +5243,12 @@ nsRuleNode::ComputeVisibilityData(void* aStartStruct,
SETDSC_ENUMERATED, parentVisibility->mPointerEvents,
NS_STYLE_POINTER_EVENTS_AUTO, 0, 0, 0, 0);
// writing-mode: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForWritingMode(), visibility->mWritingMode,
canStoreInRuleTree, SETDSC_ENUMERATED,
parentVisibility->mWritingMode,
NS_STYLE_WRITING_MODE_HORIZONTAL_TB, 0, 0, 0, 0);
COMPUTE_END_INHERITED(Visibility, visibility)
}

View File

@ -2305,6 +2305,7 @@ nsStyleVisibility::nsStyleVisibility(nsPresContext* aPresContext)
mVisible = NS_STYLE_VISIBILITY_VISIBLE;
mPointerEvents = NS_STYLE_POINTER_EVENTS_AUTO;
mWritingMode = NS_STYLE_WRITING_MODE_HORIZONTAL_TB;
}
nsStyleVisibility::nsStyleVisibility(const nsStyleVisibility& aSource)
@ -2313,13 +2314,14 @@ nsStyleVisibility::nsStyleVisibility(const nsStyleVisibility& aSource)
mDirection = aSource.mDirection;
mVisible = aSource.mVisible;
mPointerEvents = aSource.mPointerEvents;
mWritingMode = aSource.mWritingMode;
}
nsChangeHint nsStyleVisibility::CalcDifference(const nsStyleVisibility& aOther) const
{
nsChangeHint hint = nsChangeHint(0);
if (mDirection != aOther.mDirection) {
if (mDirection != aOther.mDirection || mWritingMode != aOther.mWritingMode) {
NS_UpdateHint(hint, nsChangeHint_ReconstructFrame);
} else {
if (mVisible != aOther.mVisible) {

View File

@ -1370,6 +1370,7 @@ struct nsStyleVisibility {
uint8_t mDirection; // [inherited] see nsStyleConsts.h NS_STYLE_DIRECTION_*
uint8_t mVisible; // [inherited]
uint8_t mPointerEvents; // [inherited] see nsStyleConsts.h
uint8_t mWritingMode; // [inherited] see nsStyleConsts.h
bool IsVisible() const {
return (mVisible == NS_STYLE_VISIBILITY_VISIBLE);

View File

@ -4257,6 +4257,22 @@ if (SpecialPowers.getBoolPref("layout.css.flexbox.enabled")) {
gCSSProperties["display"].other_values.push("inline-flex");
}
if (SpecialPowers.getBoolPref("layout.css.vertical-text.enabled")) {
var verticalTextProperties = {
"writing-mode": {
domProp: "writingMode",
inherited: true,
type: CSS_TYPE_LONGHAND,
initial_values: [ "horizontal-tb" ],
other_values: [ "vertical-lr", "vertical-rl" ],
invalid_values: [ "10px", "30%", "justify", "auto", "1em" ]
}
};
for (var prop in verticalTextProperties) {
gCSSProperties[prop] = verticalTextProperties[prop];
}
}
if (SpecialPowers.getBoolPref("layout.css.font-features.enabled")) {
var fontFeatureProperties = {
"font-kerning": {

View File

@ -1772,6 +1772,9 @@ pref("layout.css.scope-pseudo.enabled", false);
pref("layout.css.scope-pseudo.enabled", true);
#endif
// Is support for CSS vertical text enabled?
pref("layout.css.vertical-text.enabled", false);
// pref for which side vertical scrollbars should be on
// 0 = end-side in UI direction
// 1 = end-side in document/content direction