static nsSVGRenderingObserver * GetEffectPropertyForURI(nsIURI *aURI, nsIFrame *aFrame, const FramePropertyDescriptor *aProperty, nsSVGRenderingObserver * (* aCreate)(nsIURI *, nsIFrame *, bool)) { if (!aURI) return nsnull; FrameProperties props = aFrame->Properties(); nsSVGEffects::URIObserverHashtable *hashtable = static_cast<nsSVGEffects::URIObserverHashtable*>(props.Get(aProperty)); if (!hashtable) { hashtable = new nsSVGEffects::URIObserverHashtable(); hashtable->Init(); props.Set(aProperty, hashtable); } nsSVGRenderingObserver* prop = static_cast<nsSVGRenderingObserver*>(hashtable->GetWeak(aURI)); if (!prop) { bool watchImage = aProperty == nsSVGEffects::BackgroundImageProperty(); prop = aCreate(aURI, aFrame, watchImage); hashtable->Put(aURI, prop); } return prop; }
static PRUnichar* GetValueAt(nsIFrame* aTableOrRowFrame, const FramePropertyDescriptor* aProperty, nsIAtom* aAttribute, int32_t aRowOrColIndex) { FrameProperties props = aTableOrRowFrame->Properties(); nsValueList* valueList = static_cast<nsValueList*>(props.Get(aProperty)); if (!valueList) { // The property isn't there yet, so set it nsAutoString values; aTableOrRowFrame->GetContent()->GetAttr(kNameSpaceID_None, aAttribute, values); if (!values.IsEmpty()) valueList = new nsValueList(values); if (!valueList || !valueList->mArray.Length()) { delete valueList; // ok either way, delete is null safe return nullptr; } props.Set(aProperty, valueList); } int32_t count = valueList->mArray.Length(); return (aRowOrColIndex < count) ? valueList->mArray[aRowOrColIndex] : valueList->mArray[count-1]; }
static void ParseFrameAttribute(nsIFrame* aFrame, nsIAtom* aAttribute, bool aAllowMultiValues) { nsAutoString attrValue; nsIContent* frameContent = aFrame->GetContent(); frameContent->GetAttr(kNameSpaceID_None, aAttribute, attrValue); if (!attrValue.IsEmpty()) { nsTArray<int8_t>* valueList = ExtractStyleValues(attrValue, aAttribute, aAllowMultiValues); // If valueList is null, that indicates a problem with the attribute value. // Only set properties on a valid attribute value. if (valueList) { // The code reading the property assumes that this list is nonempty. NS_ASSERTION(valueList->Length() >= 1, "valueList should not be empty!"); FrameProperties props = aFrame->Properties(); props.Set(AttributeToProperty(aAttribute), valueList); } else { ReportParseError(aFrame, aAttribute->GetUTF16String(), attrValue.get()); } } }
static LayerActivity* GetLayerActivityForUpdate(nsIFrame* aFrame) { FrameProperties properties = aFrame->Properties(); LayerActivity* layerActivity = static_cast<LayerActivity*>(properties.Get(LayerActivityProperty())); if (layerActivity) { gLayerActivityTracker->MarkUsed(layerActivity); } else { if (!gLayerActivityTracker) { gLayerActivityTracker = new LayerActivityTracker(); } layerActivity = new LayerActivity(aFrame); gLayerActivityTracker->AddObject(layerActivity); aFrame->AddStateBits(NS_FRAME_HAS_LAYER_ACTIVITY_PROPERTY); properties.Set(LayerActivityProperty(), layerActivity); } return layerActivity; }
void nsFloatManager::StoreRegionFor(nsIFrame* aFloat, nsRect& aRegion) { nsRect rect = aFloat->GetRect(); FrameProperties props = aFloat->Properties(); if (aRegion.IsEqualEdges(rect)) { props.Delete(FloatRegionProperty()); } else { nsMargin* storedMargin = static_cast<nsMargin*> (props.Get(FloatRegionProperty())); if (!storedMargin) { storedMargin = new nsMargin(); props.Set(FloatRegionProperty(), storedMargin); } *storedMargin = aRegion - rect; } }
static nsSVGFilterProperty* GetOrCreateFilterProperty(nsIFrame *aFrame) { const nsStyleSVGReset* style = aFrame->StyleSVGReset(); if (!style->HasFilters()) return nullptr; FrameProperties props = aFrame->Properties(); nsSVGFilterProperty *prop = static_cast<nsSVGFilterProperty*>(props.Get(nsSVGEffects::FilterProperty())); if (prop) return prop; prop = new nsSVGFilterProperty(style->mFilters, aFrame); if (!prop) return nullptr; NS_ADDREF(prop); props.Set(nsSVGEffects::FilterProperty(), static_cast<nsISupports*>(prop)); return prop; }
void nsFloatManager::StoreRegionFor(WritingMode aWM, nsIFrame* aFloat, const LogicalRect& aRegion, const nsSize& aContainerSize) { nsRect region = aRegion.GetPhysicalRect(aWM, aContainerSize); nsRect rect = aFloat->GetRect(); FrameProperties props = aFloat->Properties(); if (region.IsEqualEdges(rect)) { props.Delete(FloatRegionProperty()); } else { nsMargin* storedMargin = props.Get(FloatRegionProperty()); if (!storedMargin) { storedMargin = new nsMargin(); props.Set(FloatRegionProperty(), storedMargin); } *storedMargin = region - rect; } }
static nsSVGRenderingObserver * GetEffectProperty(nsIURI *aURI, nsIFrame *aFrame, const FramePropertyDescriptor *aProperty, nsSVGRenderingObserver * (* aCreate)(nsIURI *, nsIFrame *, bool)) { if (!aURI) return nsnull; FrameProperties props = aFrame->Properties(); nsSVGRenderingObserver *prop = static_cast<nsSVGRenderingObserver*>(props.Get(aProperty)); if (prop) return prop; prop = aCreate(aURI, aFrame, false); if (!prop) return nsnull; NS_ADDREF(prop); props.Set(aProperty, static_cast<nsISupports*>(prop)); return prop; }
// static void StickyScrollContainer::ComputeStickyOffsets(nsIFrame* aFrame) { nsIScrollableFrame* scrollableFrame = nsLayoutUtils::GetNearestScrollableFrame(aFrame->GetParent(), nsLayoutUtils::SCROLLABLE_SAME_DOC | nsLayoutUtils::SCROLLABLE_INCLUDE_HIDDEN); if (!scrollableFrame) { // Bail. return; } nsSize scrollContainerSize = scrollableFrame->GetScrolledFrame()-> GetContentRectRelativeToSelf().Size(); nsMargin computedOffsets; const nsStylePosition* position = aFrame->StylePosition(); computedOffsets.left = ComputeStickySideOffset(eSideLeft, position->mOffset, scrollContainerSize.width); computedOffsets.right = ComputeStickySideOffset(eSideRight, position->mOffset, scrollContainerSize.width); computedOffsets.top = ComputeStickySideOffset(eSideTop, position->mOffset, scrollContainerSize.height); computedOffsets.bottom = ComputeStickySideOffset(eSideBottom, position->mOffset, scrollContainerSize.height); // Store the offset FrameProperties props = aFrame->Properties(); nsMargin* offsets = static_cast<nsMargin*> (props.Get(nsIFrame::ComputedOffsetProperty())); if (offsets) { *offsets = computedOffsets; } else { props.Set(nsIFrame::ComputedOffsetProperty(), new nsMargin(computedOffsets)); } }
// static StickyScrollContainer* StickyScrollContainer::GetStickyScrollContainerForFrame(nsIFrame* aFrame) { nsIScrollableFrame* scrollFrame = nsLayoutUtils::GetNearestScrollableFrame(aFrame->GetParent(), nsLayoutUtils::SCROLLABLE_SAME_DOC | nsLayoutUtils::SCROLLABLE_INCLUDE_HIDDEN); if (!scrollFrame) { // We might not find any, for instance in the case of // <html style="position: fixed"> return nullptr; } FrameProperties props = static_cast<nsIFrame*>(do_QueryFrame(scrollFrame))-> Properties(); StickyScrollContainer* s = static_cast<StickyScrollContainer*> (props.Get(StickyScrollContainerProperty())); if (!s) { s = new StickyScrollContainer(scrollFrame); props.Set(StickyScrollContainerProperty(), s); } return s; }