};
enum CSSGradientRepeat { NonRepeating, Repeating };
+// This struct is stack allocated and allocated as part of vectors.
+// When allocated on the stack its members are found by conservative
+// stack scanning. When allocated as part of Vectors in heap-allocated
+// objects its members are visited via the containing object's
+// (CSSGradientValue) traceAfterDispatch method.
struct CSSGradientColorStop {
+ ALLOW_ONLY_INLINE_ALLOCATION();
+public:
CSSGradientColorStop() : m_colorIsDerivedFromElement(false) { };
- RefPtr<CSSPrimitiveValue> m_position; // percentage or length
- RefPtr<CSSPrimitiveValue> m_color;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_position; // percentage or length
+ RefPtrWillBeMember<CSSPrimitiveValue> m_color;
Color m_resolvedColor;
bool m_colorIsDerivedFromElement;
bool operator==(const CSSGradientColorStop& other) const
return compareCSSValuePtr(m_color, other.m_color)
&& compareCSSValuePtr(m_position, other.m_position);
}
+
+ void trace(Visitor*);
};
class CSSGradientValue : public CSSImageGeneratorValue {
public:
PassRefPtr<Image> image(RenderObject*, const IntSize&);
- void setFirstX(PassRefPtr<CSSPrimitiveValue> val) { m_firstX = val; }
- void setFirstY(PassRefPtr<CSSPrimitiveValue> val) { m_firstY = val; }
- void setSecondX(PassRefPtr<CSSPrimitiveValue> val) { m_secondX = val; }
- void setSecondY(PassRefPtr<CSSPrimitiveValue> val) { m_secondY = val; }
+ void setFirstX(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_firstX = val; }
+ void setFirstY(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_firstY = val; }
+ void setSecondX(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_secondX = val; }
+ void setSecondY(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_secondY = val; }
void addStop(const CSSGradientColorStop& stop) { m_stops.append(stop); }
bool knownToBeOpaque(const RenderObject*) const;
void loadSubimages(ResourceFetcher*) { }
- PassRefPtr<CSSGradientValue> gradientWithStylesResolved(const TextLinkColors&, Color currentColor);
+ PassRefPtrWillBeRawPtr<CSSGradientValue> gradientWithStylesResolved(const TextLinkColors&, Color currentColor);
+
+ void traceAfterDispatch(Visitor*);
protected:
CSSGradientValue(ClassType classType, CSSGradientRepeat repeat, CSSGradientType gradientType)
bool isCacheable() const;
// Points. Some of these may be null.
- RefPtr<CSSPrimitiveValue> m_firstX;
- RefPtr<CSSPrimitiveValue> m_firstY;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_firstX;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_firstY;
- RefPtr<CSSPrimitiveValue> m_secondX;
- RefPtr<CSSPrimitiveValue> m_secondY;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_secondX;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_secondY;
// Stops
- Vector<CSSGradientColorStop, 2> m_stops;
+ WillBeHeapVector<CSSGradientColorStop, 2> m_stops;
bool m_stopsSorted;
CSSGradientType m_gradientType;
bool m_repeating;
class CSSLinearGradientValue : public CSSGradientValue {
public:
- static PassRefPtr<CSSLinearGradientValue> create(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSLinearGradient)
+ static PassRefPtrWillBeRawPtr<CSSLinearGradientValue> create(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSLinearGradient)
{
- return adoptRef(new CSSLinearGradientValue(repeat, gradientType));
+ return adoptRefCountedWillBeRefCountedGarbageCollected(new CSSLinearGradientValue(repeat, gradientType));
}
- void setAngle(PassRefPtr<CSSPrimitiveValue> val) { m_angle = val; }
+ void setAngle(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_angle = val; }
String customCSSText() const;
// Create the gradient for a given size.
PassRefPtr<Gradient> createGradient(const CSSToLengthConversionData&, const IntSize&);
- PassRefPtr<CSSLinearGradientValue> clone() const
+ PassRefPtrWillBeRawPtr<CSSLinearGradientValue> clone() const
{
- return adoptRef(new CSSLinearGradientValue(*this));
+ return adoptRefCountedWillBeRefCountedGarbageCollected(new CSSLinearGradientValue(*this));
}
bool equals(const CSSLinearGradientValue&) const;
+ void traceAfterDispatch(Visitor*);
+
private:
CSSLinearGradientValue(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSLinearGradient)
: CSSGradientValue(LinearGradientClass, repeat, gradientType)
{
}
- RefPtr<CSSPrimitiveValue> m_angle; // may be null.
+ RefPtrWillBeMember<CSSPrimitiveValue> m_angle; // may be null.
};
DEFINE_CSS_VALUE_TYPE_CASTS(CSSLinearGradientValue, isLinearGradientValue());
class CSSRadialGradientValue : public CSSGradientValue {
public:
- static PassRefPtr<CSSRadialGradientValue> create(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSRadialGradient)
+ static PassRefPtrWillBeRawPtr<CSSRadialGradientValue> create(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSRadialGradient)
{
- return adoptRef(new CSSRadialGradientValue(repeat, gradientType));
+ return adoptRefCountedWillBeRefCountedGarbageCollected(new CSSRadialGradientValue(repeat, gradientType));
}
- PassRefPtr<CSSRadialGradientValue> clone() const
+ PassRefPtrWillBeRawPtr<CSSRadialGradientValue> clone() const
{
- return adoptRef(new CSSRadialGradientValue(*this));
+ return adoptRefCountedWillBeRefCountedGarbageCollected(new CSSRadialGradientValue(*this));
}
String customCSSText() const;
- void setFirstRadius(PassRefPtr<CSSPrimitiveValue> val) { m_firstRadius = val; }
- void setSecondRadius(PassRefPtr<CSSPrimitiveValue> val) { m_secondRadius = val; }
+ void setFirstRadius(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_firstRadius = val; }
+ void setSecondRadius(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_secondRadius = val; }
- void setShape(PassRefPtr<CSSPrimitiveValue> val) { m_shape = val; }
- void setSizingBehavior(PassRefPtr<CSSPrimitiveValue> val) { m_sizingBehavior = val; }
+ void setShape(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_shape = val; }
+ void setSizingBehavior(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_sizingBehavior = val; }
- void setEndHorizontalSize(PassRefPtr<CSSPrimitiveValue> val) { m_endHorizontalSize = val; }
- void setEndVerticalSize(PassRefPtr<CSSPrimitiveValue> val) { m_endVerticalSize = val; }
+ void setEndHorizontalSize(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_endHorizontalSize = val; }
+ void setEndVerticalSize(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> val) { m_endVerticalSize = val; }
// Create the gradient for a given size.
PassRefPtr<Gradient> createGradient(const CSSToLengthConversionData&, const IntSize&);
bool equals(const CSSRadialGradientValue&) const;
+ void traceAfterDispatch(Visitor*);
+
private:
CSSRadialGradientValue(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSRadialGradient)
: CSSGradientValue(RadialGradientClass, repeat, gradientType)
float resolveRadius(CSSPrimitiveValue*, const CSSToLengthConversionData&, float* widthOrHeight = 0);
// These may be null for non-deprecated gradients.
- RefPtr<CSSPrimitiveValue> m_firstRadius;
- RefPtr<CSSPrimitiveValue> m_secondRadius;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_firstRadius;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_secondRadius;
// The below are only used for non-deprecated gradients. Any of them may be null.
- RefPtr<CSSPrimitiveValue> m_shape;
- RefPtr<CSSPrimitiveValue> m_sizingBehavior;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_shape;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_sizingBehavior;
- RefPtr<CSSPrimitiveValue> m_endHorizontalSize;
- RefPtr<CSSPrimitiveValue> m_endVerticalSize;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_endHorizontalSize;
+ RefPtrWillBeMember<CSSPrimitiveValue> m_endVerticalSize;
};
DEFINE_CSS_VALUE_TYPE_CASTS(CSSRadialGradientValue, isRadialGradientValue());