Bug 1257208 - Use the nsTextNode concrete type in several places in DirectionalityUtils.cpp instead of nsINode and nsIContent; r=peterv

This commit is contained in:
Ehsan Akhgari 2016-03-18 17:21:50 -04:00
parent 8b4ef1c72e
commit 938b1ad7c4
5 changed files with 36 additions and 28 deletions

View File

@ -386,7 +386,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)
{
@ -412,7 +412,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<nsTextNode*>(child);
}
}
child = child->GetNextNode(aElement);
@ -454,7 +454,7 @@ public:
MOZ_COUNT_DTOR(nsTextNodeDirectionalityMap);
}
void AddEntry(nsINode* aTextNode, Element* aElement)
void AddEntry(nsTextNode* aTextNode, Element* aElement)
{
if (!mElements.Contains(aElement)) {
mElements.Put(aElement);
@ -463,7 +463,7 @@ public:
}
}
void RemoveEntry(nsINode* aTextNode, Element* aElement)
void RemoveEntry(nsTextNode* aTextNode, Element* aElement)
{
NS_ASSERTION(mElements.Contains(aElement),
"element already removed from map");
@ -505,7 +505,7 @@ private:
// and remove the text node from the map
nsINode* oldTextNode = static_cast<Element*>(aData);
Element* rootNode = aEntry->GetKey();
nsINode* newTextNode = nullptr;
nsTextNode* newTextNode = nullptr;
if (rootNode->GetParentNode() && rootNode->HasDirAuto()) {
newTextNode = WalkDescendantsSetDirectionFromText(rootNode, true,
oldTextNode);
@ -545,14 +545,14 @@ public:
MOZ_ASSERT(clearedEntries == 0, "Map should be empty already");
}
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) {
@ -570,8 +570,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");
@ -645,7 +645,7 @@ SetDirectionalityOnDescendants(Element* aElement, Directionality aDir,
void
WalkAncestorsResetAutoDirection(Element* aElement, bool aNotify)
{
nsINode* setByNode;
nsTextNode* setByNode;
Element* parent = aElement->GetParentElement();
while (parent && parent->NodeOrAncestorHasDirAuto()) {
@ -655,7 +655,7 @@ WalkAncestorsResetAutoDirection(Element* aElement, bool aNotify)
// Remove it from the map and reset its direction by the downward
// propagation algorithm
setByNode =
static_cast<nsINode*>(parent->GetProperty(nsGkAtoms::dirAutoSetBy));
static_cast<nsTextNode*>(parent->GetProperty(nsGkAtoms::dirAutoSetBy));
if (setByNode) {
nsTextNodeDirectionalityMap::RemoveElementFromMap(setByNode, parent);
}
@ -681,8 +681,9 @@ WalkDescendantsResetAutoDirection(Element* aElement)
continue;
}
if (child->HasTextNodeDirectionalityMap()) {
nsTextNodeDirectionalityMap::ResetTextNodeDirection(child, nullptr);
if (child->IsNodeOfType(nsIDOMNode::TEXT_NODE) &&
child->HasTextNodeDirectionalityMap()) {
nsTextNodeDirectionalityMap::ResetTextNodeDirection(static_cast<nsTextNode*>(child), nullptr);
nsTextNodeDirectionalityMap::EnsureMapIsClearFor(child);
}
child = child->GetNextNode(aElement);
@ -725,7 +726,7 @@ WalkDescendantsSetDirAuto(Element* aElement, bool aNotify)
}
}
nsINode* textNode = WalkDescendantsSetDirectionFromText(aElement, aNotify);
nsTextNode* textNode = WalkDescendantsSetDirectionFromText(aElement, aNotify);
if (textNode) {
nsTextNodeDirectionalityMap::AddEntryToMap(textNode, aElement);
}
@ -746,7 +747,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,
@ -760,8 +761,8 @@ void SetAncestorDirectionIfAuto(nsINode* aTextNode, Directionality aDir,
if (parent->HasDirAuto()) {
bool resetDirection = false;
nsINode* directionWasSetByTextNode =
static_cast<nsINode*>(parent->GetProperty(nsGkAtoms::dirAutoSetBy));
nsTextNode* directionWasSetByTextNode =
static_cast<nsTextNode*>(parent->GetProperty(nsGkAtoms::dirAutoSetBy));
if (!parent->HasDirAutoSet()) {
// Fast path if parent's direction is not yet set by any descendant
@ -832,7 +833,7 @@ TextNodeWillChangeDirection(nsIContent* aTextNode, Directionality* aOldDir,
}
void
TextNodeChangedDirection(nsIContent* aTextNode, Directionality aOldDir,
TextNodeChangedDirection(nsTextNode* aTextNode, Directionality aOldDir,
bool aNotify)
{
Directionality newDir = GetDirectionFromText(aTextNode->GetText());
@ -862,7 +863,7 @@ TextNodeChangedDirection(nsIContent* aTextNode, Directionality aOldDir,
}
void
SetDirectionFromNewTextNode(nsIContent* aTextNode)
SetDirectionFromNewTextNode(nsTextNode* aTextNode)
{
if (!NodeAffectsDirAutoAncestor(aTextNode)) {
return;
@ -949,8 +950,8 @@ OnSetDirAttr(Element* aElement, const nsAttrValue* aNewValue,
WalkDescendantsSetDirAuto(aElement, aNotify);
} else {
if (aElement->HasDirAutoSet()) {
nsINode* setByNode =
static_cast<nsINode*>(aElement->GetProperty(nsGkAtoms::dirAutoSetBy));
nsTextNode* setByNode =
static_cast<nsTextNode*>(aElement->GetProperty(nsGkAtoms::dirAutoSetBy));
nsTextNodeDirectionalityMap::RemoveElementFromMap(setByNode, aElement);
}
SetDirectionalityOnDescendants(aElement,
@ -1001,8 +1002,8 @@ SetDirOnBind(mozilla::dom::Element* aElement, nsIContent* aParent)
void ResetDir(mozilla::dom::Element* aElement)
{
if (aElement->HasDirAutoSet()) {
nsINode* setByNode =
static_cast<nsINode*>(aElement->GetProperty(nsGkAtoms::dirAutoSetBy));
nsTextNode* setByNode =
static_cast<nsTextNode*>(aElement->GetProperty(nsGkAtoms::dirAutoSetBy));
nsTextNodeDirectionalityMap::RemoveElementFromMap(setByNode, aElement);
}

View File

@ -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

View File

@ -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<nsTextNode*>(this), oldDir, aNotify);
}
// Notify observers

View File

@ -1624,8 +1624,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); }

View File

@ -49,6 +49,7 @@ public:
// nsIDOMNode
NS_FORWARD_NSIDOMNODE_TO_NSINODE
using mozilla::dom::Text::GetParentElement;
// nsIDOMCharacterData
NS_FORWARD_NSIDOMCHARACTERDATA(nsGenericDOMDataNode::)