[tbb-commits] [tor-browser/esr24] Bug 1037641 - Split SetDirectionFromChangedTextNode into TextNodeWillChangeDirection and TextNodeChangedDirection. r=ehsan, a=abillings

mikeperry at torproject.org mikeperry at torproject.org
Fri Aug 29 05:26:45 UTC 2014


commit 38dc93ccf1549b964930c50bbc3f55f2377b6e23
Author: Simon Montagu <smontagu at smontagu.org>
Date:   Wed Aug 6 12:02:59 2014 +0300

    Bug 1037641 - Split SetDirectionFromChangedTextNode into TextNodeWillChangeDirection and TextNodeChangedDirection. r=ehsan, a=abillings
---
 content/base/public/DirectionalityUtils.h |   18 +++++++++++++-----
 content/base/src/DirectionalityUtils.cpp  |   26 ++++++++++++++------------
 content/base/src/nsGenericDOMDataNode.cpp |   10 +++++++---
 3 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/content/base/public/DirectionalityUtils.h b/content/base/public/DirectionalityUtils.h
index 85a7e78..4b1758c 100644
--- a/content/base/public/DirectionalityUtils.h
+++ b/content/base/public/DirectionalityUtils.h
@@ -79,12 +79,20 @@ void WalkDescendantsSetDirAuto(mozilla::dom::Element* aElement,
 void WalkDescendantsClearAncestorDirAuto(mozilla::dom::Element* aElement);
 
 /**
- * When the contents of a text node have changed, deal with any elements whose
- * directionality needs to change
+ * When the contents of a text node are about to change, retrieve the current
+ * directionality of the text
+ *
+ * @return whether the text node affects the directionality of any element
+ */
+bool TextNodeWillChangeDirection(nsIContent* aTextNode, Directionality* aOldDir,
+                                 uint32_t aOffset);
+
+/**
+ * After the contents of a text node have changed, change the directionality
+ * of any elements whose directionality is determined by that node
  */
-void SetDirectionFromChangedTextNode(nsIContent* aTextNode, uint32_t aOffset,
-                                     const PRUnichar* aBuffer, uint32_t aLength,
-                                     bool aNotify);
+void TextNodeChangedDirection(nsIContent* aTextNode, Directionality aOldDir,
+                              bool aNotify);
 
 /**
  * When a text node is appended to an element, find any ancestors with dir=auto
diff --git a/content/base/src/DirectionalityUtils.cpp b/content/base/src/DirectionalityUtils.cpp
index 9fa8a12..a689a19 100644
--- a/content/base/src/DirectionalityUtils.cpp
+++ b/content/base/src/DirectionalityUtils.cpp
@@ -316,6 +316,7 @@ GetDirectionFromText(const PRUnichar* aText, const uint32_t aLength,
         start < end &&
         NS_IS_LOW_SURROGATE(*start)) {
       ch = SURROGATE_TO_UCS4(ch, *start++);
+      current++;
     }
 
     Directionality dir = GetDirectionFromChar(ch);
@@ -822,26 +823,27 @@ void SetAncestorDirectionIfAuto(nsINode* aTextNode, Directionality aDir,
   }
 }
 
-void
-SetDirectionFromChangedTextNode(nsIContent* aTextNode, uint32_t aOffset,
-                                const PRUnichar* aBuffer, uint32_t aLength,
-                                bool aNotify)
+bool
+TextNodeWillChangeDirection(nsIContent* aTextNode, Directionality* aOldDir,
+                            uint32_t aOffset)
 {
   if (!NodeAffectsDirAutoAncestor(aTextNode)) {
     nsTextNodeDirectionalityMap::EnsureMapIsClearFor(aTextNode);
-    return;
+    return false;
   }
 
   uint32_t firstStrong;
-  Directionality oldDir = GetDirectionFromText(aTextNode->GetText(),
-                                               &firstStrong);
-  if (aOffset > firstStrong) {
-    return;
-  }
+  *aOldDir = GetDirectionFromText(aTextNode->GetText(), &firstStrong);
+  return (aOffset <= firstStrong);
+}
 
-  Directionality newDir = GetDirectionFromText(aBuffer, aLength);
+void
+TextNodeChangedDirection(nsIContent* aTextNode, Directionality aOldDir,
+                         bool aNotify)
+{
+  Directionality newDir = GetDirectionFromText(aTextNode->GetText());
   if (newDir == eDir_NotSet) {
-    if (oldDir != eDir_NotSet && aTextNode->HasTextNodeDirectionalityMap()) {
+    if (aOldDir != eDir_NotSet && aTextNode->HasTextNodeDirectionalityMap()) {
       // This node used to have a strong directional character but no
       // longer does. ResetTextNodeDirection() will re-resolve the
       // directionality of any elements whose directionality was
diff --git a/content/base/src/nsGenericDOMDataNode.cpp b/content/base/src/nsGenericDOMDataNode.cpp
index 2efc6cd..69ee693 100644
--- a/content/base/src/nsGenericDOMDataNode.cpp
+++ b/content/base/src/nsGenericDOMDataNode.cpp
@@ -294,9 +294,9 @@ nsGenericDOMDataNode::SetTextInternal(uint32_t aOffset, uint32_t aCount,
     nsNodeUtils::CharacterDataWillChange(this, &info);
   }
 
-  if (NodeType() == nsIDOMNode::TEXT_NODE) {
-    SetDirectionFromChangedTextNode(this, aOffset, aBuffer, aLength, aNotify);
-  }
+  Directionality oldDir = eDir_NotSet;
+  bool dirAffectsAncestor = (NodeType() == nsIDOMNode::TEXT_NODE &&
+                             TextNodeWillChangeDirection(this, &oldDir, aOffset));
 
   if (aOffset == 0 && endOffset == textLength) {
     // Replacing whole text or old text was empty.  Don't bother to check for
@@ -338,6 +338,10 @@ nsGenericDOMDataNode::SetTextInternal(uint32_t aOffset, uint32_t aCount,
     document->SetBidiEnabled();
   }
 
+  if (dirAffectsAncestor) {
+    TextNodeChangedDirection(this, oldDir, aNotify);
+  }
+
   // Notify observers
   if (aNotify) {
     CharacterDataChangeInfo info = {





More information about the tbb-commits mailing list