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:
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();