diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /layout/style/CachedInheritingStyles.cpp | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/style/CachedInheritingStyles.cpp')
-rw-r--r-- | layout/style/CachedInheritingStyles.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/layout/style/CachedInheritingStyles.cpp b/layout/style/CachedInheritingStyles.cpp new file mode 100644 index 0000000000..da6e4d24e6 --- /dev/null +++ b/layout/style/CachedInheritingStyles.cpp @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/CachedInheritingStyles.h" + +#include "mozilla/ComputedStyle.h" +#include "nsCOMPtr.h" +#include "nsWindowSizes.h" + +namespace mozilla { + +void CachedInheritingStyles::Insert(ComputedStyle* aStyle) { + MOZ_ASSERT(aStyle); + MOZ_ASSERT(aStyle->IsInheritingAnonBox() || + aStyle->IsLazilyCascadedPseudoElement()); + + if (IsEmpty()) { + RefPtr<ComputedStyle> s = aStyle; + mBits = reinterpret_cast<uintptr_t>(s.forget().take()); + MOZ_ASSERT(!IsEmpty() && !IsIndirect()); + } else if (IsIndirect()) { + AsIndirect()->AppendElement(aStyle); + } else { + IndirectCache* cache = new IndirectCache(); + cache->AppendElement(dont_AddRef(AsDirect())); + cache->AppendElement(aStyle); + mBits = reinterpret_cast<uintptr_t>(cache) | 1; + MOZ_ASSERT(IsIndirect()); + } +} + +ComputedStyle* CachedInheritingStyles::Lookup(PseudoStyleType aType) const { + MOZ_ASSERT(PseudoStyle::IsPseudoElement(aType) || + PseudoStyle::IsInheritingAnonBox(aType)); + if (IsIndirect()) { + for (auto& style : *AsIndirect()) { + if (style->GetPseudoType() == aType) { + return style; + } + } + + return nullptr; + } + + ComputedStyle* direct = AsDirect(); + return direct && direct->GetPseudoType() == aType ? direct : nullptr; +} + +void CachedInheritingStyles::AddSizeOfIncludingThis(nsWindowSizes& aSizes, + size_t* aCVsSize) const { + if (IsIndirect()) { + for (auto& style : *AsIndirect()) { + if (!aSizes.mState.HaveSeenPtr(style)) { + style->AddSizeOfIncludingThis(aSizes, aCVsSize); + } + } + + return; + } + + ComputedStyle* direct = AsDirect(); + if (direct && !aSizes.mState.HaveSeenPtr(direct)) { + direct->AddSizeOfIncludingThis(aSizes, aCVsSize); + } +} + +} // namespace mozilla |