Bug 649142 - Part 2: Convert logical properties to their physical equivalents during the cascade. r=dbaron

We will add cases to EnsurePhysicalProperty's switch statement as we
convert the existing shorthand-implemented logical properties to the
new, CSS_PROPERTY_LOGICAL-bearing properties.
This commit is contained in:
Cameron McCormack 2014-12-31 12:18:13 +11:00
Родитель 6cceecc24a
Коммит 8c1da42424
1 изменённых файлов: 38 добавлений и 3 удалений

Просмотреть файл

@ -163,6 +163,25 @@ MapSinglePropertyInto(nsCSSProperty aProp,
} }
} }
/**
* If aProperty is a logical property, converts it to the equivalent physical
* property based on writing mode information obtained from aRuleData's
* style context. Returns true if aProperty was changed.
*/
static inline void
EnsurePhysicalProperty(nsCSSProperty& aProperty, nsRuleData* aRuleData)
{
uint8_t direction = aRuleData->mStyleContext->StyleVisibility()->mDirection;
bool ltr = direction == NS_STYLE_DIRECTION_LTR;
switch (aProperty) {
default:
NS_ABORT_IF_FALSE(nsCSSProps::PropHasFlags(aProperty,
CSS_PROPERTY_LOGICAL),
"unhandled logical property");
}
}
void void
nsCSSCompressedDataBlock::MapRuleInfoInto(nsRuleData *aRuleData) const nsCSSCompressedDataBlock::MapRuleInfoInto(nsRuleData *aRuleData) const
{ {
@ -173,10 +192,20 @@ nsCSSCompressedDataBlock::MapRuleInfoInto(nsRuleData *aRuleData) const
if (!(aRuleData->mSIDs & mStyleBits)) if (!(aRuleData->mSIDs & mStyleBits))
return; return;
for (uint32_t i = 0; i < mNumProps; i++) { // We process these in reverse order so that we end up mapping the
// right property when one can be expressed using both logical and
// physical property names.
for (uint32_t i = mNumProps; i-- > 0; ) {
nsCSSProperty iProp = PropertyAtIndex(i); nsCSSProperty iProp = PropertyAtIndex(i);
if (nsCachedStyleData::GetBitForSID(nsCSSProps::kSIDTable[iProp]) & if (nsCachedStyleData::GetBitForSID(nsCSSProps::kSIDTable[iProp]) &
aRuleData->mSIDs) { aRuleData->mSIDs) {
if (nsCSSProps::PropHasFlags(iProp, CSS_PROPERTY_LOGICAL)) {
EnsurePhysicalProperty(iProp, aRuleData);
// We can't cache anything on the rule tree if we use any data from
// the style context, since data cached in the rule tree could be
// used with a style context with a different value.
aRuleData->mCanStoreInRuleTree = false;
}
nsCSSValue* target = aRuleData->ValueFor(iProp); nsCSSValue* target = aRuleData->ValueFor(iProp);
if (target->GetUnit() == eCSSUnit_Null) { if (target->GetUnit() == eCSSUnit_Null) {
const nsCSSValue *val = ValueAtIndex(i); const nsCSSValue *val = ValueAtIndex(i);
@ -605,11 +634,17 @@ nsCSSExpandedDataBlock::MapRuleInfoInto(nsCSSProperty aPropID,
const nsCSSValue* src = PropertyAt(aPropID); const nsCSSValue* src = PropertyAt(aPropID);
MOZ_ASSERT(src->GetUnit() != eCSSUnit_Null); MOZ_ASSERT(src->GetUnit() != eCSSUnit_Null);
nsCSSValue* dest = aRuleData->ValueFor(aPropID); nsCSSProperty physicalProp = aPropID;
if (nsCSSProps::PropHasFlags(aPropID, CSS_PROPERTY_LOGICAL)) {
EnsurePhysicalProperty(physicalProp, aRuleData);
aRuleData->mCanStoreInRuleTree = false;
}
nsCSSValue* dest = aRuleData->ValueFor(physicalProp);
MOZ_ASSERT(dest->GetUnit() == eCSSUnit_TokenStream && MOZ_ASSERT(dest->GetUnit() == eCSSUnit_TokenStream &&
dest->GetTokenStreamValue()->mPropertyID == aPropID); dest->GetTokenStreamValue()->mPropertyID == aPropID);
MapSinglePropertyInto(aPropID, src, dest, aRuleData); MapSinglePropertyInto(physicalProp, src, dest, aRuleData);
} }
#ifdef DEBUG #ifdef DEBUG