tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdom/webidl/CSSMathSum.webidl | 3+--
Mlayout/style/typedom/CSSMathSum.cpp | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Mlayout/style/typedom/CSSMathSum.h | 14++++++++++++--
Mlayout/style/typedom/CSSMathValue.cpp | 3+++
Mlayout/style/typedom/CSSMathValue.h | 2++
Mlayout/style/typedom/CSSStyleValue.cpp | 4++++
Mlayout/style/typedom/CSSStyleValue.h | 9++++++++-
Mlayout/style/typedom/StylePropertyMap.cpp | 3+++
Mtesting/web-platform/meta/css/css-typed-om/stylevalue-subclasses/numeric-objects/cssMathValue.tentative.html.ini | 9---------
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