tor-browser

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

commit 928030275a4ed8a6a634724f8609c08d800ab7da
parent 1515116d27c2e2f9707e845b2ef6c024e8fe75ea
Author: Eitan Isaacson <eitan@monotonous.org>
Date:   Wed,  3 Dec 2025 19:02:57 +0000

Bug 2002345 - Store bounds in nsRect unique pointer. r=Jamie

This is more compact then a general use, variable length nsTArray.
An nsTArray also has a size field, so in addition to the 32 x 4 bits for
the bounds, there is an additional 64 bit integer. Dropping that integer
cuts the allocated space by a third.

Differential Revision: https://phabricator.services.mozilla.com/D274633

Diffstat:
Maccessible/base/AccAttributes.cpp | 9+++++++++
Maccessible/base/AccAttributes.h | 15++++++++++++++-
Maccessible/generic/LocalAccessible.cpp | 11++---------
Maccessible/ipc/RemoteAccessible.cpp | 13++++---------
4 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/accessible/base/AccAttributes.cpp b/accessible/base/AccAttributes.cpp @@ -84,6 +84,9 @@ void AccAttributes::StringFromValueAndName(nsAtom* aAttrName, [&aValueString](const UniquePtr<gfx::Matrix4x4>& val) { aValueString.AppendPrintf("Matrix4x4=%s", ToString(*val).c_str()); }, + [&aValueString](const UniquePtr<nsRect>& val) { + aValueString.AppendPrintf("nsRect=%s", ToString(*val).c_str()); + }, [&aValueString](const nsTArray<uint64_t>& val) { if (const size_t len = val.Length()) { for (size_t i = 0; i < len - 1; i++) { @@ -257,6 +260,10 @@ void AccAttributes::CopyTo(AccAttributes* aDest, bool aOnlyMissing) const { MOZ_ASSERT_UNREACHABLE( "Trying to copy an AccAttributes containing a matrix"); }, + [](const UniquePtr<nsRect>& val) { + MOZ_ASSERT_UNREACHABLE( + "Trying to copy an AccAttributes containing a nsrect"); + }, [](const nsTArray<uint64_t>& val) { // We don't copy arrays. MOZ_ASSERT_UNREACHABLE( @@ -317,6 +324,8 @@ size_t AccAttributes::Entry::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) { aMallocSizeOf); } else if (mValue->is<UniquePtr<gfx::Matrix4x4>>()) { size += aMallocSizeOf(mValue->as<UniquePtr<gfx::Matrix4x4>>().get()); + } else if (mValue->is<UniquePtr<nsRect>>()) { + size += aMallocSizeOf(mValue->as<UniquePtr<nsRect>>().get()); } else if (mValue->is<nsTArray<uint64_t>>()) { size += mValue->as<nsTArray<uint64_t>>().ShallowSizeOfExcludingThis( aMallocSizeOf); diff --git a/accessible/base/AccAttributes.h b/accessible/base/AccAttributes.h @@ -107,7 +107,7 @@ class AccAttributes { Variant<bool, float, double, int32_t, RefPtr<nsAtom>, nsTArray<int32_t>, CSSCoord, FontSize, Color, DeleteEntry, UniquePtr<nsString>, RefPtr<AccAttributes>, uint64_t, UniquePtr<AccGroupInfo>, - UniquePtr<gfx::Matrix4x4>, nsTArray<uint64_t>, + UniquePtr<gfx::Matrix4x4>, UniquePtr<nsRect>, nsTArray<uint64_t>, nsTArray<TextOffsetAttribute>, WritingMode, nsTArray<RefPtr<nsAtom>>>; static_assert(sizeof(AttrValueType) <= 16); @@ -136,6 +136,9 @@ class AccAttributes { } else if constexpr (std::is_same_v<ValType, gfx::Matrix4x4>) { UniquePtr<gfx::Matrix4x4> value = MakeUnique<gfx::Matrix4x4>(aAttrValue); mData.InsertOrUpdate(aAttrName, AsVariant(std::move(value))); + } else if constexpr (std::is_same_v<ValType, nsRect>) { + UniquePtr<nsRect> value = MakeUnique<nsRect>(aAttrValue); + mData.InsertOrUpdate(aAttrName, AsVariant(std::move(value))); } else if constexpr (std::is_same_v<ValType, AccGroupInfo*>) { UniquePtr<AccGroupInfo> value(aAttrValue); mData.InsertOrUpdate(aAttrName, AsVariant(std::move(value))); @@ -163,6 +166,11 @@ class AccAttributes { const T& val = *(value->as<UniquePtr<gfx::Matrix4x4>>()); return SomeRef(val); } + } else if constexpr (std::is_same_v<nsRect, T>) { + if (value->is<UniquePtr<nsRect>>()) { + const T& val = *(value->as<UniquePtr<nsRect>>()); + return SomeRef(val); + } } else { if (value->is<T>()) { const T& val = value->as<T>(); @@ -265,6 +273,11 @@ class AccAttributes { const T& val = *(mValue->as<UniquePtr<gfx::Matrix4x4>>()); return SomeRef(val); } + } else if constexpr (std::is_same_v<nsRect, T>) { + if (mValue->is<UniquePtr<nsRect>>()) { + const T& val = *(mValue->as<UniquePtr<nsRect>>()); + return SomeRef(val); + } } else { if (mValue->is<T>()) { const T& val = mValue->as<T>(); diff --git a/accessible/generic/LocalAccessible.cpp b/accessible/generic/LocalAccessible.cpp @@ -3678,15 +3678,8 @@ already_AddRefed<AccAttributes> LocalAccessible::BundleFieldsForCache( if (boundsChanged) { mBounds = Some(newBoundsRect); - nsTArray<int32_t> boundsArray(4); - - boundsArray.AppendElement(newBoundsRect.x); - boundsArray.AppendElement(newBoundsRect.y); - boundsArray.AppendElement(newBoundsRect.width); - boundsArray.AppendElement(newBoundsRect.height); - - fields->SetAttribute(CacheKey::ParentRelativeBounds, - std::move(boundsArray)); + UniquePtr<nsRect> ptr = MakeUnique<nsRect>(newBoundsRect); + fields->SetAttribute(CacheKey::ParentRelativeBounds, std::move(ptr)); } if (frame && frame->ScrollableOverflowRect().IsEmpty()) { diff --git a/accessible/ipc/RemoteAccessible.cpp b/accessible/ipc/RemoteAccessible.cpp @@ -759,16 +759,11 @@ Maybe<nsRect> RemoteAccessible::RetrieveCachedBounds() const { } ASSERT_DOMAINS_ACTIVE(CacheDomain::Bounds); - Maybe<const nsTArray<int32_t>&> maybeArray = - mCachedFields->GetAttribute<nsTArray<int32_t>>( + Maybe<const UniquePtr<nsRect>&> maybeRect = + mCachedFields->GetAttribute<UniquePtr<nsRect>>( CacheKey::ParentRelativeBounds); - if (maybeArray) { - const nsTArray<int32_t>& relativeBoundsArr = *maybeArray; - MOZ_ASSERT(relativeBoundsArr.Length() == 4, - "Incorrectly sized bounds array"); - nsRect relativeBoundsRect(relativeBoundsArr[0], relativeBoundsArr[1], - relativeBoundsArr[2], relativeBoundsArr[3]); - return Some(relativeBoundsRect); + if (maybeRect) { + return Some(*(*maybeRect)); } return Nothing();