From 4c64d8d6d7efa3610914d5e87ed6f47bea9500a9 Mon Sep 17 00:00:00 2001 From: Raphael G Date: Sun, 21 Jan 2018 10:20:35 -0500 Subject: [PATCH] M1257208 Fix build errors with gcc >= 5 --- dom/base/DirectionalityUtils.cpp | 46 +++++++++++++++---------------- dom/base/DirectionalityUtils.h | 4 +-- dom/base/nsGenericDOMDataNode.cpp | 5 +++- dom/base/nsINode.h | 7 +++-- dom/base/nsTextNode.h | 1 + 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/dom/base/DirectionalityUtils.cpp b/dom/base/DirectionalityUtils.cpp index e78b30e64..e2357d8bc 100644 --- a/dom/base/DirectionalityUtils.cpp +++ b/dom/base/DirectionalityUtils.cpp @@ -387,7 +387,7 @@ GetDirectionFromText(const nsTextFragment* aFrag, * know not to return it * @return the text node containing the character that determined the direction */ -static nsINode* +static nsTextNode* WalkDescendantsSetDirectionFromText(Element* aElement, bool aNotify = true, nsINode* aChangedNode = nullptr) { @@ -413,7 +413,7 @@ WalkDescendantsSetDirectionFromText(Element* aElement, bool aNotify = true, // We found a descendant text node with strong directional characters. // Set the directionality of aElement to the corresponding value. aElement->SetDirectionality(textNodeDir, aNotify); - return child; + return static_cast(child); } } child = child->GetNextNode(aElement); @@ -471,7 +471,7 @@ public: NS_RELEASE(textNode); } - void AddEntry(nsINode* aTextNode, Element* aElement) + void AddEntry(nsTextNode* aTextNode, Element* aElement) { if (!mElements.Contains(aElement)) { mElements.Put(aElement); @@ -482,7 +482,7 @@ public: } } - void RemoveEntry(nsINode* aTextNode, Element* aElement) + void RemoveEntry(nsTextNode* aTextNode, Element* aElement) { NS_ASSERTION(mElements.Contains(aElement), "element already removed from map"); @@ -542,7 +542,7 @@ private: static_cast(aData); nsINode* oldTextNode = data->mNode; Element* rootNode = aEntry->GetKey(); - nsINode* newTextNode = nullptr; + nsTextNode* newTextNode = nullptr; if (rootNode->GetParentNode() && rootNode->HasDirAuto()) { newTextNode = WalkDescendantsSetDirectionFromText(rootNode, true, oldTextNode); @@ -600,14 +600,14 @@ public: } } - static void RemoveElementFromMap(nsINode* aTextNode, Element* aElement) + static void RemoveElementFromMap(nsTextNode* aTextNode, Element* aElement) { if (aTextNode->HasTextNodeDirectionalityMap()) { GetDirectionalityMap(aTextNode)->RemoveEntry(aTextNode, aElement); } } - static void AddEntryToMap(nsINode* aTextNode, Element* aElement) + static void AddEntryToMap(nsTextNode* aTextNode, Element* aElement) { nsTextNodeDirectionalityMap* map = GetDirectionalityMap(aTextNode); if (!map) { @@ -625,8 +625,8 @@ public: return GetDirectionalityMap(aTextNode)->UpdateAutoDirection(aDir); } - static void ResetTextNodeDirection(nsINode* aTextNode, - nsINode* aChangedTextNode) + static void ResetTextNodeDirection(nsTextNode* aTextNode, + nsTextNode* aChangedTextNode) { MOZ_ASSERT(aTextNode->HasTextNodeDirectionalityMap(), "Map missing in ResetTextNodeDirection"); @@ -701,7 +701,7 @@ SetDirectionalityOnDescendants(Element* aElement, Directionality aDir, void WalkAncestorsResetAutoDirection(Element* aElement, bool aNotify) { - nsINode* setByNode; + nsTextNode* setByNode; Element* parent = aElement->GetParentElement(); while (parent && parent->NodeOrAncestorHasDirAuto()) { @@ -711,7 +711,7 @@ WalkAncestorsResetAutoDirection(Element* aElement, bool aNotify) // Remove it from the map and reset its direction by the downward // propagation algorithm setByNode = - static_cast(parent->GetProperty(nsGkAtoms::dirAutoSetBy)); + static_cast(parent->GetProperty(nsGkAtoms::dirAutoSetBy)); if (setByNode) { nsTextNodeDirectionalityMap::RemoveElementFromMap(setByNode, parent); } @@ -737,11 +737,9 @@ WalkDescendantsResetAutoDirection(Element* aElement) continue; } - if (child->HasTextNodeDirectionalityMap()) { - nsTextNodeDirectionalityMap::ResetTextNodeDirection(child, nullptr); - // Don't call nsTextNodeDirectionalityMap::EnsureMapIsClearFor(child) - // since ResetTextNodeDirection may have kept elements in child's - // DirectionalityMap. + if (child->NodeType() == nsIDOMNode::TEXT_NODE && + child->HasTextNodeDirectionalityMap()) { + nsTextNodeDirectionalityMap::ResetTextNodeDirection(static_cast(child), nullptr); } child = child->GetNextNode(aElement); } @@ -783,7 +781,7 @@ WalkDescendantsSetDirAuto(Element* aElement, bool aNotify) } } - nsINode* textNode = WalkDescendantsSetDirectionFromText(aElement, aNotify); + nsTextNode* textNode = WalkDescendantsSetDirectionFromText(aElement, aNotify); if (textNode) { nsTextNodeDirectionalityMap::AddEntryToMap(textNode, aElement); } @@ -804,7 +802,7 @@ WalkDescendantsClearAncestorDirAuto(Element* aElement) } } -void SetAncestorDirectionIfAuto(nsINode* aTextNode, Directionality aDir, +void SetAncestorDirectionIfAuto(nsTextNode* aTextNode, Directionality aDir, bool aNotify = true) { MOZ_ASSERT(aTextNode->NodeType() == nsIDOMNode::TEXT_NODE, @@ -818,8 +816,8 @@ void SetAncestorDirectionIfAuto(nsINode* aTextNode, Directionality aDir, if (parent->HasDirAuto()) { bool resetDirection = false; - nsINode* directionWasSetByTextNode = - static_cast(parent->GetProperty(nsGkAtoms::dirAutoSetBy)); + nsTextNode* directionWasSetByTextNode = + static_cast(parent->GetProperty(nsGkAtoms::dirAutoSetBy)); if (!parent->HasDirAutoSet()) { // Fast path if parent's direction is not yet set by any descendant @@ -890,7 +888,7 @@ TextNodeWillChangeDirection(nsIContent* aTextNode, Directionality* aOldDir, } void -TextNodeChangedDirection(nsIContent* aTextNode, Directionality aOldDir, +TextNodeChangedDirection(nsTextNode* aTextNode, Directionality aOldDir, bool aNotify) { Directionality newDir = GetDirectionFromText(aTextNode->GetText()); @@ -920,7 +918,7 @@ TextNodeChangedDirection(nsIContent* aTextNode, Directionality aOldDir, } void -SetDirectionFromNewTextNode(nsIContent* aTextNode) +SetDirectionFromNewTextNode(nsTextNode* aTextNode) { if (!NodeAffectsDirAutoAncestor(aTextNode)) { return; @@ -1007,8 +1005,8 @@ OnSetDirAttr(Element* aElement, const nsAttrValue* aNewValue, WalkDescendantsSetDirAuto(aElement, aNotify); } else { if (aElement->HasDirAutoSet()) { - nsINode* setByNode = - static_cast(aElement->GetProperty(nsGkAtoms::dirAutoSetBy)); + nsTextNode* setByNode = + static_cast(aElement->GetProperty(nsGkAtoms::dirAutoSetBy)); nsTextNodeDirectionalityMap::RemoveElementFromMap(setByNode, aElement); } SetDirectionalityOnDescendants(aElement, diff --git a/dom/base/DirectionalityUtils.h b/dom/base/DirectionalityUtils.h index 6d5927aa9..572182c90 100644 --- a/dom/base/DirectionalityUtils.h +++ b/dom/base/DirectionalityUtils.h @@ -89,14 +89,14 @@ bool TextNodeWillChangeDirection(nsIContent* aTextNode, Directionality* aOldDir, * After the contents of a text node have changed, change the directionality * of any elements whose directionality is determined by that node */ -void TextNodeChangedDirection(nsIContent* aTextNode, Directionality aOldDir, +void TextNodeChangedDirection(nsTextNode* aTextNode, Directionality aOldDir, bool aNotify); /** * When a text node is appended to an element, find any ancestors with dir=auto * whose directionality will be determined by the text node */ -void SetDirectionFromNewTextNode(nsIContent* aTextNode); +void SetDirectionFromNewTextNode(nsTextNode* aTextNode); /** * When a text node is removed from a document, find any ancestors whose diff --git a/dom/base/nsGenericDOMDataNode.cpp b/dom/base/nsGenericDOMDataNode.cpp index 4db131db1..91c0b5f5d 100644 --- a/dom/base/nsGenericDOMDataNode.cpp +++ b/dom/base/nsGenericDOMDataNode.cpp @@ -371,7 +371,10 @@ nsGenericDOMDataNode::SetTextInternal(uint32_t aOffset, uint32_t aCount, } if (dirAffectsAncestor) { - TextNodeChangedDirection(this, oldDir, aNotify); + // dirAffectsAncestor being true implies that we have a text node, see + // above. + MOZ_ASSERT(NodeType() == nsIDOMNode::TEXT_NODE); + TextNodeChangedDirection(static_cast(this), oldDir, aNotify); } // Notify observers diff --git a/dom/base/nsINode.h b/dom/base/nsINode.h index a9457fa1f..cdcaca52f 100644 --- a/dom/base/nsINode.h +++ b/dom/base/nsINode.h @@ -1621,8 +1621,11 @@ public: "ClearHasTextNodeDirectionalityMap on non-text node"); ClearBoolFlag(NodeHasTextNodeDirectionalityMap); } - bool HasTextNodeDirectionalityMap() const - { return GetBoolFlag(NodeHasTextNodeDirectionalityMap); } + bool HasTextNodeDirectionalityMap() const { + MOZ_ASSERT(NodeType() == nsIDOMNode::TEXT_NODE, + "HasTextNodeDirectionalityMap on non-text node"); + return GetBoolFlag(NodeHasTextNodeDirectionalityMap); + } void SetHasDirAuto() { SetBoolFlag(NodeHasDirAuto); } void ClearHasDirAuto() { ClearBoolFlag(NodeHasDirAuto); } diff --git a/dom/base/nsTextNode.h b/dom/base/nsTextNode.h index 24725ecb8..488540a82 100644 --- a/dom/base/nsTextNode.h +++ b/dom/base/nsTextNode.h @@ -49,6 +49,7 @@ public: // nsIDOMNode NS_FORWARD_NSIDOMNODE_TO_NSINODE + using mozilla::dom::Text::GetParentElement; // nsIDOMCharacterData NS_FORWARD_NSIDOMCHARACTERDATA(nsGenericDOMDataNode::)