void nsCSSCompressedDataBlock::MapRuleInfoInto(nsRuleData *aRuleData) const { // If we have no data for these structs, then return immediately. // This optimization should make us return most of the time, so we // have to worry much less (although still some) about the speed of // the rest of the function. if (!(aRuleData->mSIDs & mStyleBits)) return; nsIDocument* doc = aRuleData->mPresContext->Document(); const char* cursor = Block(); const char* cursor_end = BlockEnd(); while (cursor < cursor_end) { nsCSSProperty iProp = PropertyAtCursor(cursor); NS_ABORT_IF_FALSE(!nsCSSProps::IsShorthand(iProp), "out of range"); if (nsCachedStyleData::GetBitForSID(nsCSSProps::kSIDTable[iProp]) & aRuleData->mSIDs) { nsCSSValue* target = aRuleData->ValueFor(iProp); if (target->GetUnit() == eCSSUnit_Null) { const nsCSSValue *val = ValueAtCursor(cursor); NS_ABORT_IF_FALSE(val->GetUnit() != eCSSUnit_Null, "oops"); if (ShouldStartImageLoads(aRuleData, iProp)) { TryToStartImageLoad(*val, doc, iProp); } *target = *val; if (nsCSSProps::PropHasFlags(iProp, CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED) && ShouldIgnoreColors(aRuleData)) { if (iProp == eCSSProperty_background_color) { // Force non-'transparent' background // colors to the user's default. if (target->IsNonTransparentColor()) { target->SetColorValue(aRuleData->mPresContext-> DefaultBackgroundColor()); } } else { // Ignore 'color', 'border-*-color', etc. *target = nsCSSValue(); } } } } cursor += CDBValueStorage_advance; } NS_ABORT_IF_FALSE(cursor == cursor_end, "inconsistent data"); }
static void TryToStartImageLoad(const nsCSSValue& aValue, nsIDocument* aDocument, nsCSSProperty aProperty) { if (aValue.GetUnit() == eCSSUnit_List) { for (const nsCSSValueList* l = aValue.GetListValue(); l; l = l->mNext) { TryToStartImageLoad(l->mValue, aDocument, aProperty); } } else if (nsCSSProps::PropHasFlags(aProperty, CSS_PROPERTY_IMAGE_IS_IN_ARRAY_0)) { if (aValue.GetUnit() == eCSSUnit_Array) { TryToStartImageLoadOnValue(aValue.GetArrayValue()->Item(0), aDocument); } } else { TryToStartImageLoadOnValue(aValue, aDocument); } }