summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2022-04-18 15:51:05 +0000
committerMoonchild <moonchild@palemoon.org>2022-04-18 15:51:05 +0000
commit65ed8de1fabc764eaf2da6b7be2a4b9114091693 (patch)
treed7d88983eb2842349d77d0d29a695ac35d57965f
parent2e34db5696aa45e055348b1547179a0d476bca75 (diff)
parent7ed9c249bef971e1035efe91adfd56e4345bcd70 (diff)
downloaduxp-65ed8de1fabc764eaf2da6b7be2a4b9114091693.tar.gz
Merge pull request 'Ensure UndisplayedMap handling code consistently uses a normalized parent' (#1874) from FranklinDM/UXP-contrib:work_frames-undisplayedmap-nmparent into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/1874
-rw-r--r--layout/base/nsFrameManager.cpp63
-rw-r--r--layout/base/nsFrameManager.h2
2 files changed, 48 insertions, 17 deletions
diff --git a/layout/base/nsFrameManager.cpp b/layout/base/nsFrameManager.cpp
index d6a6cb46b5..1dbc87ed95 100644
--- a/layout/base/nsFrameManager.cpp
+++ b/layout/base/nsFrameManager.cpp
@@ -90,16 +90,22 @@ public:
// Removes all entries from the hash table
void Clear();
-protected:
- LinkedList<UndisplayedNode>* GetListFor(nsIContent* aParentContent);
- LinkedList<UndisplayedNode>* GetOrCreateListFor(nsIContent* aParentContent);
- void AppendNodeFor(UndisplayedNode* aNode, nsIContent* aParentContent);
/**
* Get the applicable parent for the map lookup. This is almost always the
* provided argument, except if it's a <xbl:children> element, in which case
* it's the parent of the children element.
+ *
+ * All functions that are entry points into code that handles "parent"
+ * objects (used as the hash table keys) must ensure that the parent objects
+ * that they act on (and pass to other code) have been normalized by calling
+ * this method.
*/
- nsIContent* GetApplicableParent(nsIContent* aParent);
+ static nsIContent* GetApplicableParent(nsIContent* aParent);
+
+protected:
+ LinkedList<UndisplayedNode>* GetListFor(nsIContent* aParentContent);
+ LinkedList<UndisplayedNode>* GetOrCreateListFor(nsIContent* aParentContent);
+ void AppendNodeFor(UndisplayedNode* aNode, nsIContent* aParentContent);
};
//----------------------------------------------------------------------
@@ -131,6 +137,20 @@ nsFrameManager::Destroy()
//----------------------------------------------------------------------
+/* static */ nsIContent*
+nsFrameManager::ParentForUndisplayedMap(const nsIContent* aContent)
+{
+ MOZ_ASSERT(aContent);
+
+ nsIContent* parent = aContent->GetParentElementCrossingShadowRoot();
+ MOZ_ASSERT(parent || !aContent->GetParent(), "no non-elements");
+
+ // Normalize the parent
+ parent = UndisplayedMap::GetApplicableParent(parent);
+
+ return parent;
+}
+
/* static */ nsStyleContext*
nsFrameManager::GetStyleContextInMap(UndisplayedMap* aMap,
const nsIContent* aContent)
@@ -138,8 +158,8 @@ nsFrameManager::GetStyleContextInMap(UndisplayedMap* aMap,
if (!aContent) {
return nullptr;
}
- nsIContent* parent = aContent->GetParentElementCrossingShadowRoot();
- MOZ_ASSERT(parent || !aContent->GetParent(), "no non-elements");
+
+ nsIContent* parent = ParentForUndisplayedMap(aContent);
for (UndisplayedNode* node = aMap->GetFirstNode(parent);
node; node = node->getNext()) {
if (node->mContent == aContent)
@@ -178,8 +198,7 @@ nsFrameManager::SetStyleContextInMap(UndisplayedMap* aMap,
MOZ_ASSERT(!GetStyleContextInMap(aMap, aContent),
"Already have an entry for aContent");
- nsIContent* parent = aContent->GetParentElementCrossingShadowRoot();
- MOZ_ASSERT(parent || !aContent->GetParent(), "no non-elements");
+ nsIContent* parent = ParentForUndisplayedMap(aContent);
#ifdef DEBUG
nsIPresShell* shell = aStyleContext->PresContext()->PresShell();
NS_ASSERTION(parent || (shell && shell->GetDocument() &&
@@ -194,9 +213,9 @@ nsFrameManager::SetStyleContextInMap(UndisplayedMap* aMap,
// mUndisplayedMap and mDisplayContentsMap if the bit isn't present on a node
// that it's handling.
-if (parent) {
- parent->SetMayHaveChildrenWithLayoutBoxesDisabled();
-}
+ if (parent) {
+ parent->SetMayHaveChildrenWithLayoutBoxesDisabled();
+ }
aMap->AddNodeFor(parent, aContent, aStyleContext);
}
@@ -223,8 +242,7 @@ nsFrameManager::ChangeStyleContextInMap(UndisplayedMap* aMap,
printf("ChangeStyleContextInMap(%d): p=%p \n", i++, (void *)aContent);
#endif
- nsIContent* parent = aContent->GetParentElementCrossingShadowRoot();
- MOZ_ASSERT(parent || !aContent->GetParent(), "no non-elements");
+ nsIContent* parent = ParentForUndisplayedMap(aContent);
for (UndisplayedNode* node = aMap->GetFirstNode(parent);
node; node = node->getNext()) {
@@ -249,7 +267,11 @@ nsFrameManager::ClearUndisplayedContentIn(nsIContent* aContent,
if (!mUndisplayedMap) {
return;
}
-
+
+ // This function is an entry point into UndisplayedMap handling code, so we
+ // must call GetApplicableParent so the parent we pass around is correct.
+ aParentContent = UndisplayedMap::GetApplicableParent(aParentContent);
+
if (aParentContent &&
!aParentContent->MayHaveChildrenWithLayoutBoxesDisabled()) {
MOZ_ASSERT(!mUndisplayedMap->GetFirstNode(aParentContent),
@@ -382,6 +404,10 @@ nsFrameManager::ClearDisplayContentsIn(nsIContent* aContent,
return;
}
+ // This function is an entry point into UndisplayedMap handling code, so we
+ // must call GetApplicableParent so the parent we pass around is correct.
+ aParentContent = UndisplayedMap::GetApplicableParent(aParentContent);
+
if (aParentContent &&
!aParentContent->MayHaveChildrenWithLayoutBoxesDisabled()) {
MOZ_ASSERT(!mDisplayContentsMap->GetFirstNode(aParentContent),
@@ -684,7 +710,8 @@ nsFrameManagerBase::UndisplayedMap::GetApplicableParent(nsIContent* aParent)
LinkedList<UndisplayedNode>*
nsFrameManagerBase::UndisplayedMap::GetListFor(nsIContent* aParent)
{
- aParent = GetApplicableParent(aParent);
+ MOZ_ASSERT(aParent == GetApplicableParent(aParent),
+ "The parent that we use as the hash key must have been normalized");
LinkedList<UndisplayedNode>* list;
if (Get(aParent, &list)) {
@@ -697,7 +724,9 @@ nsFrameManagerBase::UndisplayedMap::GetListFor(nsIContent* aParent)
LinkedList<UndisplayedNode>*
nsFrameManagerBase::UndisplayedMap::GetOrCreateListFor(nsIContent* aParent)
{
- aParent = GetApplicableParent(aParent);
+ MOZ_ASSERT(aParent == GetApplicableParent(aParent),
+ "The parent that we use as the hash key must have been normalized");
+
return LookupOrAdd(aParent);
}
diff --git a/layout/base/nsFrameManager.h b/layout/base/nsFrameManager.h
index 7537888605..77484fe3f0 100644
--- a/layout/base/nsFrameManager.h
+++ b/layout/base/nsFrameManager.h
@@ -182,6 +182,8 @@ public:
void RestoreFrameStateFor(nsIFrame* aFrame,
nsILayoutHistoryState* aState);
protected:
+ static nsIContent* ParentForUndisplayedMap(const nsIContent* aContent);
+
void ClearAllMapsFor(nsIContent* aParentContent);
static nsStyleContext* GetStyleContextInMap(UndisplayedMap* aMap,