| Index: Source/core/css/CSSValue.h
|
| diff --git a/Source/core/css/CSSValue.h b/Source/core/css/CSSValue.h
|
| index ac7df50a004ea2b8914057e1cfcd39f5a06dba76..b2f0a4ef382f1e1c301ec9e2f4a9503e59ef061c 100644
|
| --- a/Source/core/css/CSSValue.h
|
| +++ b/Source/core/css/CSSValue.h
|
| @@ -41,6 +41,7 @@ public:
|
| : m_data(const_cast<CSSValueObject*>(&cssValueObject))
|
| {
|
| ASSERT(m_data);
|
| + ASSERT(isObject());
|
| ref();
|
| }
|
|
|
| @@ -50,6 +51,7 @@ public:
|
| : m_data(cssValueObject.leakRef())
|
| {
|
| static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must be a container for CSSValueObject");
|
| + ASSERT(isObject());
|
| ASSERT(m_data);
|
| }
|
|
|
| @@ -58,6 +60,7 @@ public:
|
| : m_data(cssValueObject.release().leakRef())
|
| {
|
| static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must be a container for CSSValueObject");
|
| + ASSERT(isObject());
|
| ASSERT(m_data);
|
| }
|
| #endif
|
| @@ -90,12 +93,20 @@ public:
|
|
|
| bool operator==(const CSSValue& other) const
|
| {
|
| + if (m_data == other.m_data)
|
| + return true;
|
| + if (!isObject() || !other.isObject())
|
| + return false;
|
| return m_data->equals(*other.m_data);
|
| }
|
|
|
| // TODO: Remove this and update callsites to use operator== instead.
|
| bool equals(const CSSValue& other) const
|
| {
|
| + if (m_data == other.m_data)
|
| + return true;
|
| + if (!isObject() || !other.isObject())
|
| + return false;
|
| return m_data->equals(*other.m_data);
|
| }
|
|
|
| @@ -105,46 +116,53 @@ public:
|
| }
|
|
|
| // Methods that proxy to CSSValueObject.
|
| - String cssText() const { return m_data->cssText(); }
|
| - bool hasFailedOrCanceledSubresources() const { return m_data->hasFailedOrCanceledSubresources(); };
|
| - bool isPrimitiveValue() const { return m_data->isPrimitiveValue(); }
|
| - bool isValueList() const { return m_data->isValueList(); }
|
| - bool isBaseValueList() const { return m_data->isBaseValueList(); }
|
| - bool isBorderImageSliceValue() const { return m_data->isBorderImageSliceValue(); }
|
| - bool isCanvasValue() const { return m_data->isCanvasValue(); }
|
| - bool isCursorImageValue() const { return m_data->isCursorImageValue(); }
|
| - bool isCrossfadeValue() const { return m_data->isCrossfadeValue(); }
|
| - bool isFontFeatureValue() const { return m_data->isFontFeatureValue(); }
|
| - bool isFontFaceSrcValue() const { return m_data->isFontFaceSrcValue(); }
|
| - bool isFunctionValue() const { return m_data->isFunctionValue(); }
|
| - bool isImageGeneratorValue() const { return m_data->isImageGeneratorValue(); }
|
| - bool isGradientValue() const { return m_data->isGradientValue(); }
|
| - bool isImageSetValue() const { return m_data->isImageSetValue(); }
|
| - bool isImageValue() const { return m_data->isImageValue(); }
|
| - bool isImplicitInitialValue() const { return m_data->isImplicitInitialValue(); };
|
| - bool isInheritedValue() const { return m_data->isInheritedValue(); };
|
| - bool isInitialValue() const { return m_data->isInitialValue(); };
|
| - bool isUnsetValue() const { return m_data->isUnsetValue(); };
|
| - bool isCSSWideKeyword() const { return m_data->isCSSWideKeyword(); };
|
| - bool isLinearGradientValue() const { return m_data->isLinearGradientValue(); };
|
| - bool isPathValue() const { return m_data->isPathValue(); };
|
| - bool isRadialGradientValue() const { return m_data->isRadialGradientValue(); };
|
| - bool isReflectValue() const { return m_data->isReflectValue(); };
|
| - bool isShadowValue() const { return m_data->isShadowValue(); };
|
| - bool isCubicBezierTimingFunctionValue() const { return m_data->isCubicBezierTimingFunctionValue(); };
|
| - bool isStepsTimingFunctionValue() const { return m_data->isStepsTimingFunctionValue(); };
|
| - bool isLineBoxContainValue() const { return m_data->isLineBoxContainValue(); };
|
| - bool isCalcValue() const { return m_data->isCalcValue(); };
|
| - bool isGridTemplateAreasValue() const { return m_data->isGridTemplateAreasValue(); };
|
| - bool isSVGDocumentValue() const { return m_data->isSVGDocumentValue(); };
|
| - bool isContentDistributionValue() const { return m_data->isContentDistributionValue(); };
|
| - bool isUnicodeRangeValue() const { return m_data->isUnicodeRangeValue(); };
|
| - bool isGridLineNamesValue() const { return m_data->isGridLineNamesValue(); };
|
| + String cssText() const
|
| + {
|
| + if (isObject())
|
| + return m_data->cssText();
|
| + return CSSPrimitiveValue(reinterpret_cast<CSSPrimitiveValue::CSSLargePrimitiveValue*>(m_data.get())).cssText();
|
| + }
|
| +
|
| + bool hasFailedOrCanceledSubresources() const { return isObject() ? m_data->hasFailedOrCanceledSubresources() : false; };
|
| + bool isPrimitiveValue() const { return isObject() ? m_data->isPrimitiveValue() : true; }
|
| + bool isValueList() const { return isObject() ? m_data->isValueList() : false; }
|
| + bool isBaseValueList() const { return isObject() ? m_data->isBaseValueList() : false; }
|
| + bool isBorderImageSliceValue() const { return isObject() ? m_data->isBorderImageSliceValue() : false; }
|
| + bool isCanvasValue() const { return isObject() ? m_data->isCanvasValue() : false; }
|
| + bool isCursorImageValue() const { return isObject() ? m_data->isCursorImageValue() : false; }
|
| + bool isCrossfadeValue() const { return isObject() ? m_data->isCrossfadeValue() : false; }
|
| + bool isFontFeatureValue() const { return isObject() ? m_data->isFontFeatureValue(): false; }
|
| + bool isFontFaceSrcValue() const { return isObject() ? m_data->isFontFaceSrcValue(): false; }
|
| + bool isFunctionValue() const { return isObject() ? m_data->isFunctionValue(): false; }
|
| + bool isImageGeneratorValue() const { return isObject() ? m_data->isImageGeneratorValue(): false; }
|
| + bool isGradientValue() const { return isObject() ? m_data->isGradientValue(): false; }
|
| + bool isImageSetValue() const { return isObject() ? m_data->isImageSetValue(): false; }
|
| + bool isImageValue() const { return isObject() ? m_data->isImageValue(): false; }
|
| + bool isImplicitInitialValue() const { return isObject() ? m_data->isImplicitInitialValue(): false; }
|
| + bool isInheritedValue() const { return isObject() ? m_data->isInheritedValue(): false; }
|
| + bool isInitialValue() const { return isObject() ? m_data->isInitialValue(): false; }
|
| + bool isUnsetValue() const { return isObject() ? m_data->isUnsetValue(): false; }
|
| + bool isCSSWideKeyword() const { return isObject() ? m_data->isCSSWideKeyword(): false; }
|
| + bool isLinearGradientValue() const { return isObject() ? m_data->isLinearGradientValue(): false; }
|
| + bool isPathValue() const { return isObject() ? m_data->isPathValue(): false; }
|
| + bool isRadialGradientValue() const { return isObject() ? m_data->isRadialGradientValue(): false; }
|
| + bool isReflectValue() const { return isObject() ? m_data->isReflectValue(): false; }
|
| + bool isShadowValue() const { return isObject() ? m_data->isShadowValue(): false; }
|
| + bool isCubicBezierTimingFunctionValue() const { return isObject() ? m_data->isCubicBezierTimingFunctionValue(): false; }
|
| + bool isStepsTimingFunctionValue() const { return isObject() ? m_data->isStepsTimingFunctionValue(): false; }
|
| + bool isLineBoxContainValue() const { return isObject() ? m_data->isLineBoxContainValue(): false; }
|
| + bool isCalcValue() const { return isObject() ? m_data->isCalcValue(): false; }
|
| + bool isGridTemplateAreasValue() const { return isObject() ? m_data->isGridTemplateAreasValue(): false; }
|
| + bool isSVGDocumentValue() const { return isObject() ? m_data->isSVGDocumentValue(): false; }
|
| + bool isContentDistributionValue() const { return isObject() ? m_data->isContentDistributionValue(): false; }
|
| + bool isUnicodeRangeValue() const { return isObject() ? m_data->isUnicodeRangeValue(): false; }
|
| + bool isGridLineNamesValue() const { return isObject() ? m_data->isGridLineNamesValue(): false; }
|
|
|
| DEFINE_INLINE_TRACE()
|
| {
|
| ASSERT(m_data);
|
| - visitor->trace(m_data);
|
| + if (isObject())
|
| + visitor->trace(m_data);
|
| }
|
|
|
| // Only for use by the toFooCSSValue() macros. Don't use this.
|
| @@ -162,7 +180,7 @@ private:
|
| void ref() const
|
| {
|
| #if !ENABLE(OILPAN)
|
| - if (m_data)
|
| + if (m_data && isObject())
|
| m_data->ref();
|
| #endif
|
| }
|
| @@ -170,11 +188,16 @@ private:
|
| void deref() const
|
| {
|
| #if !ENABLE(OILPAN)
|
| - if (m_data)
|
| + if (m_data && isObject())
|
| m_data->deref();
|
| #endif
|
| }
|
|
|
| + bool isObject() const
|
| + {
|
| + return !(*reinterpret_cast<const uintptr_t*>(&m_data) & 1);
|
| + }
|
| +
|
| RawPtrWillBeMember<CSSValueObject> m_data;
|
| };
|
|
|
| @@ -256,6 +279,10 @@ public:
|
|
|
| bool operator==(const NullableCSSValue& rhs) const
|
| {
|
| + if (m_data == rhs.m_data)
|
| + return true;
|
| + if (!isObject() || (rhs && !rhs.isObject()))
|
| + return false;
|
| return m_data ? rhs.m_data && m_data->equals(*rhs.m_data) : !bool(rhs.m_data);
|
| }
|
|
|
| @@ -296,7 +323,8 @@ public:
|
|
|
| DEFINE_INLINE_TRACE()
|
| {
|
| - visitor->trace(m_data);
|
| + if (isObject())
|
| + visitor->trace(m_data);
|
| }
|
|
|
| // Only for use by the toFooCSSValue() macros. Don't use this.
|
| @@ -311,7 +339,7 @@ private:
|
| void ref() const
|
| {
|
| #if !ENABLE(OILPAN)
|
| - if (m_data)
|
| + if (m_data && isObject())
|
| m_data->ref();
|
| #endif
|
| }
|
| @@ -319,11 +347,16 @@ private:
|
| void deref() const
|
| {
|
| #if !ENABLE(OILPAN)
|
| - if (m_data)
|
| + if (m_data && isObject())
|
| m_data->deref();
|
| #endif
|
| }
|
|
|
| + bool isObject() const
|
| + {
|
| + return !(*reinterpret_cast<const uintptr_t*>(&m_data) & 1);
|
| + }
|
| +
|
| RawPtrWillBeMember<CSSValueObject> m_data;
|
| };
|
|
|
|
|