commit c21e42d057f26995f1672875a6e0db62471c0f91
parent 629031f7bd2c1e2db9e450d2fb69ea3b5e553a35
Author: Jan Varga <jvarga@igalia.com>
Date: Thu, 4 Dec 2025 10:18:06 +0000
Bug 1990419 - Add missing pieces to CSSMathSum for Typed OM reification; r=emilio,webidl,firefox-style-system-reviewers
This patch extends CSSMathSum with functionality required for reification of
calculated <length> values in CSS Typed OM. These additions are part of the
initial infrastructure needed to expose math sum through the TypedValue enum
and enable relevant WPT reification tests.
Differential Revision: https://phabricator.services.mozilla.com/D270611
Diffstat:
9 files changed, 86 insertions(+), 22 deletions(-)
diff --git a/dom/webidl/CSSMathSum.webidl b/dom/webidl/CSSMathSum.webidl
@@ -12,6 +12,5 @@
[Exposed=(Window, Worker, PaintWorklet), Pref="layout.css.typed-om.enabled"]
interface CSSMathSum : CSSMathValue {
[Throws] constructor(CSSNumberish... args);
- // TODO: Remove [Throws] once the values attribute is fully implemented
- [Throws] readonly attribute CSSNumericArray values;
+ readonly attribute CSSNumericArray values;
};
diff --git a/layout/style/typedom/CSSMathSum.cpp b/layout/style/typedom/CSSMathSum.cpp
@@ -8,14 +8,21 @@
#include "mozilla/AlreadyAddRefed.h"
#include "mozilla/ErrorResult.h"
-#include "mozilla/RefPtr.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/dom/CSSMathSumBinding.h"
+#include "mozilla/dom/CSSNumericArray.h"
+#include "mozilla/dom/CSSNumericValueBinding.h"
+#include "mozilla/dom/CSSUnitValue.h"
namespace mozilla::dom {
-CSSMathSum::CSSMathSum(nsCOMPtr<nsISupports> aParent)
- : CSSMathValue(std::move(aParent)) {}
+CSSMathSum::CSSMathSum(nsCOMPtr<nsISupports> aParent,
+ RefPtr<CSSNumericArray> aValues)
+ : CSSMathValue(std::move(aParent), ValueType::MathSum),
+ mValues(std::move(aValues)) {}
+
+NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(CSSMathSum, CSSMathValue)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(CSSMathSum, CSSMathValue, mValues)
JSObject* CSSMathSum::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) {
@@ -24,18 +31,56 @@ JSObject* CSSMathSum::WrapObject(JSContext* aCx,
// start of CSSMathSum Web IDL implementation
+// https://www.w3.org/TR/css-typed-om-1/#dom-cssmathsum-cssmathsum
+//
// static
already_AddRefed<CSSMathSum> CSSMathSum::Constructor(
const GlobalObject& aGlobal, const Sequence<OwningCSSNumberish>& aArgs,
ErrorResult& aRv) {
- return MakeAndAddRef<CSSMathSum>(aGlobal.GetAsSupports());
-}
+ nsCOMPtr<nsISupports> global = aGlobal.GetAsSupports();
+
+ // Step 1.
+
+ nsTArray<RefPtr<CSSNumericValue>> values;
+
+ for (const OwningCSSNumberish& arg : aArgs) {
+ RefPtr<CSSNumericValue> value;
+
+ if (arg.IsDouble()) {
+ value = MakeRefPtr<CSSUnitValue>(global, arg.GetAsDouble(), "number"_ns);
+ } else {
+ MOZ_ASSERT(arg.IsCSSNumericValue());
+
+ value = arg.GetAsCSSNumericValue();
+ }
+
+ values.AppendElement(std::move(value));
+ }
+
+ // Step 2.
-CSSNumericArray* CSSMathSum::GetValues(ErrorResult& aRv) const {
- aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
- return nullptr;
+ if (values.IsEmpty()) {
+ aRv.ThrowSyntaxError("Arguments can't be empty");
+ return nullptr;
+ }
+
+ // XXX Step 3 is not yet implemented!
+
+ // Step 4.
+
+ auto array = MakeRefPtr<CSSNumericArray>(global, std::move(values));
+
+ return MakeAndAddRef<CSSMathSum>(global, std::move(array));
}
+CSSNumericArray* CSSMathSum::Values() const { return mValues; }
+
// end of CSSMathSum Web IDL implementation
+CSSMathSum& CSSStyleValue::GetAsCSSMathSum() {
+ MOZ_DIAGNOSTIC_ASSERT(mValueType == ValueType::MathSum);
+
+ return *static_cast<CSSMathSum*>(this);
+}
+
} // namespace mozilla::dom
diff --git a/layout/style/typedom/CSSMathSum.h b/layout/style/typedom/CSSMathSum.h
@@ -8,9 +8,12 @@
#define LAYOUT_STYLE_TYPEDOM_CSSMATHSUM_H_
#include "js/TypeDecls.h"
+#include "mozilla/RefPtr.h"
#include "mozilla/dom/CSSMathValue.h"
#include "mozilla/dom/CSSNumericArrayBindingFwd.h"
#include "mozilla/dom/CSSNumericValueBindingFwd.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsISupportsImpl.h"
template <class T>
class nsCOMPtr;
@@ -22,29 +25,36 @@ class ErrorResult;
namespace dom {
+class CSSNumericArray;
class GlobalObject;
template <typename T>
class Sequence;
class CSSMathSum final : public CSSMathValue {
public:
- explicit CSSMathSum(nsCOMPtr<nsISupports> aParent);
+ CSSMathSum(nsCOMPtr<nsISupports> aParent, RefPtr<CSSNumericArray> aValues);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(CSSMathSum, CSSMathValue)
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
// start of CSSMathSum Web IDL declarations
+ // https://www.w3.org/TR/css-typed-om-1/#dom-cssmathsum-cssmathsum
static already_AddRefed<CSSMathSum> Constructor(
const GlobalObject& aGlobal, const Sequence<OwningCSSNumberish>& aArgs,
ErrorResult& aRv);
- CSSNumericArray* GetValues(ErrorResult& aRv) const;
+ CSSNumericArray* Values() const;
// end of CSSMathSum Web IDL declarations
private:
virtual ~CSSMathSum() = default;
+
+ RefPtr<CSSNumericArray> mValues;
};
} // namespace dom
diff --git a/layout/style/typedom/CSSMathValue.cpp b/layout/style/typedom/CSSMathValue.cpp
@@ -13,6 +13,9 @@ namespace mozilla::dom {
CSSMathValue::CSSMathValue(nsCOMPtr<nsISupports> aParent)
: CSSNumericValue(std::move(aParent)) {}
+CSSMathValue::CSSMathValue(nsCOMPtr<nsISupports> aParent, ValueType aValueType)
+ : CSSNumericValue(std::move(aParent), aValueType) {}
+
// start of CSSMathtValue Web IDL implementation
CSSMathOperator CSSMathValue::Operator() const { return CSSMathOperator::Sum; }
diff --git a/layout/style/typedom/CSSMathValue.h b/layout/style/typedom/CSSMathValue.h
@@ -23,6 +23,8 @@ class CSSMathValue : public CSSNumericValue {
public:
explicit CSSMathValue(nsCOMPtr<nsISupports> aParent);
+ CSSMathValue(nsCOMPtr<nsISupports> aParent, ValueType aValueType);
+
// start of CSSMathValue Web IDL declarations
CSSMathOperator Operator() const;
diff --git a/layout/style/typedom/CSSStyleValue.cpp b/layout/style/typedom/CSSStyleValue.cpp
@@ -75,4 +75,8 @@ bool CSSStyleValue::IsCSSUnitValue() const {
return mValueType == ValueType::UnitValue;
}
+bool CSSStyleValue::IsCSSMathSum() const {
+ return mValueType == ValueType::MathSum;
+}
+
} // namespace mozilla::dom
diff --git a/layout/style/typedom/CSSStyleValue.h b/layout/style/typedom/CSSStyleValue.h
@@ -27,6 +27,7 @@ namespace dom {
class GlobalObject;
class CSSKeywordValue;
+class CSSMathSum;
class CSSUnitValue;
class CSSUnsupportedValue;
@@ -36,7 +37,8 @@ class CSSStyleValue : public nsISupports, public nsWrapperCache {
Uninitialized,
UnsupportedValue,
KeywordValue,
- UnitValue
+ UnitValue,
+ MathSum,
};
explicit CSSStyleValue(nsCOMPtr<nsISupports> aParent);
@@ -89,6 +91,11 @@ class CSSStyleValue : public nsISupports, public nsWrapperCache {
// Defined in CSSUnitValue.cpp
CSSUnitValue& GetAsCSSUnitValue();
+ bool IsCSSMathSum() const;
+
+ // Defined in CSSMathSum.cpp
+ CSSMathSum& GetAsCSSMathSum();
+
protected:
virtual ~CSSStyleValue() = default;
diff --git a/layout/style/typedom/StylePropertyMap.cpp b/layout/style/typedom/StylePropertyMap.cpp
@@ -78,6 +78,9 @@ void StylePropertyMap::Set(
nsAutoCString cssText;
switch (styleValue.GetValueType()) {
+ case CSSStyleValue::ValueType::MathSum:
+ break;
+
case CSSStyleValue::ValueType::UnitValue:
break;
diff --git a/testing/web-platform/meta/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssMathValue.tentative.html.ini b/testing/web-platform/meta/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssMathValue.tentative.html.ini
@@ -1,13 +1,4 @@
[cssMathValue.tentative.html]
- [Constructing a CSSMathSum with no arguments throws a SyntaxError]
- expected: FAIL
-
- [CSSMathSum can be constructed from a single number CSSUnitValue]
- expected: FAIL
-
- [CSSMathSum can be constructed from more than one number CSSUnitValue]
- expected: FAIL
-
[Constructing a CSSMathProduct with no arguments throws a SyntaxError]
expected: FAIL