Title: [263302] trunk
Revision
263302
Author
commit-qu...@webkit.org
Date
2020-06-19 17:16:12 -0700 (Fri, 19 Jun 2020)

Log Message

Crash in WebCore::Range::borderAndTextRects
https://bugs.webkit.org/show_bug.cgi?id=209379

Patch by Pinki Gyanchandani <pgyanchand...@apple.com> on 2020-06-19
Reviewed by Darin Adler.

When a parentless node is moved to a new document, then all ranges associated with this node and its children also should
be updated with new document information.

Test woould be submitted later.

* dom/Document.cpp:
(WebCore::Document::parentlessNodeMoveToNewDocument):
* dom/Document.h:
* dom/Node.cpp:
(WebCore::Node::moveNodeToNewDocument):
* dom/Range.cpp:
(WebCore::Range::parentlessNodeMoveToNewDocumentAffectsRange):
(WebCore::Range::updateRangeForParentlessNodeMoveToNewDocument):
* dom/Range.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/fast/dom/move-detached-child-in-range-expected.txt (263301 => 263302)


--- trunk/LayoutTests/fast/dom/move-detached-child-in-range-expected.txt	2020-06-20 00:11:31 UTC (rev 263301)
+++ trunk/LayoutTests/fast/dom/move-detached-child-in-range-expected.txt	2020-06-20 00:16:12 UTC (rev 263302)
@@ -1 +1 @@
-Final end container, offset: [object HTMLHeadingElement], 1
+Final end container, offset: [object HTMLHeadingElement], 0

Modified: trunk/Source/WebCore/ChangeLog (263301 => 263302)


--- trunk/Source/WebCore/ChangeLog	2020-06-20 00:11:31 UTC (rev 263301)
+++ trunk/Source/WebCore/ChangeLog	2020-06-20 00:16:12 UTC (rev 263302)
@@ -1,3 +1,25 @@
+2020-06-19  Pinki Gyanchandani  <pgyanchand...@apple.com>
+
+        Crash in WebCore::Range::borderAndTextRects
+        https://bugs.webkit.org/show_bug.cgi?id=209379
+
+        Reviewed by Darin Adler.
+
+        When a parentless node is moved to a new document, then all ranges associated with this node and its children also should
+        be updated with new document information.
+
+        Test woould be submitted later. 
+
+        * dom/Document.cpp:
+        (WebCore::Document::parentlessNodeMoveToNewDocument):
+        * dom/Document.h:
+        * dom/Node.cpp:
+        (WebCore::Node::moveNodeToNewDocument):
+        * dom/Range.cpp:
+        (WebCore::Range::parentlessNodeMoveToNewDocumentAffectsRange):
+        (WebCore::Range::updateRangeForParentlessNodeMoveToNewDocument):
+        * dom/Range.h:
+
 2020-06-19  Truitt Savell  <tsav...@apple.com>
 
         Unreviewed, reverting r263121.

Modified: trunk/Source/WebCore/dom/Document.cpp (263301 => 263302)


--- trunk/Source/WebCore/dom/Document.cpp	2020-06-20 00:11:31 UTC (rev 263301)
+++ trunk/Source/WebCore/dom/Document.cpp	2020-06-20 00:16:12 UTC (rev 263302)
@@ -4675,6 +4675,19 @@
         m_markers->removeMarkers(node);
 }
 
+void Document::parentlessNodeMovedToNewDocument(Node& node)
+{
+    Vector<Range*, 5> rangesAffected;
+
+    for (auto* range : m_ranges) {
+        if (range->parentlessNodeMovedToNewDocumentAffectsRange(node))
+            rangesAffected.append(range);
+    }
+
+    for (auto* range : rangesAffected)
+        range->updateRangeForParentlessNodeMovedToNewDocument(node);
+}
+
 static Node* fallbackFocusNavigationStartingNodeAfterRemoval(Node& node)
 {
     return node.previousSibling() ? node.previousSibling() : node.parentNode();

Modified: trunk/Source/WebCore/dom/Document.h (263301 => 263302)


--- trunk/Source/WebCore/dom/Document.h	2020-06-20 00:11:31 UTC (rev 263301)
+++ trunk/Source/WebCore/dom/Document.h	2020-06-20 00:16:12 UTC (rev 263302)
@@ -829,6 +829,7 @@
     void nodeChildrenWillBeRemoved(ContainerNode&);
     // nodeWillBeRemoved is only safe when removing one node at a time.
     void nodeWillBeRemoved(Node&);
+    void parentlessNodeMovedToNewDocument(Node&);
 
     enum class AcceptChildOperation { Replace, InsertOrAdd };
     bool canAcceptChild(const Node& newChild, const Node* refChild, AcceptChildOperation) const;

Modified: trunk/Source/WebCore/dom/Node.cpp (263301 => 263302)


--- trunk/Source/WebCore/dom/Node.cpp	2020-06-20 00:11:31 UTC (rev 263301)
+++ trunk/Source/WebCore/dom/Node.cpp	2020-06-20 00:16:12 UTC (rev 263302)
@@ -2059,6 +2059,9 @@
 
     oldDocument.moveNodeIteratorsToNewDocument(*this, newDocument);
 
+    if (!parentNode())
+        oldDocument.parentlessNodeMovedToNewDocument(*this);
+
     if (AXObjectCache::accessibilityEnabled()) {
         if (auto* cache = oldDocument.existingAXObjectCache())
             cache->remove(*this);

Modified: trunk/Source/WebCore/dom/Range.cpp (263301 => 263302)


--- trunk/Source/WebCore/dom/Range.cpp	2020-06-20 00:11:31 UTC (rev 263301)
+++ trunk/Source/WebCore/dom/Range.cpp	2020-06-20 00:16:12 UTC (rev 263302)
@@ -1612,6 +1612,18 @@
     boundaryNodeWillBeRemoved(m_end, node);
 }
 
+bool Range::parentlessNodeMovedToNewDocumentAffectsRange(Node& node)
+{
+    return node.containsIncludingShadowDOM(m_start.container());
+}
+
+void Range::updateRangeForParentlessNodeMovedToNewDocument(Node& node)
+{
+    m_ownerDocument->detachRange(*this);
+    m_ownerDocument = node.document();
+    m_ownerDocument->attachRange(*this);
+}
+
 static inline void boundaryTextInserted(RangeBoundaryPoint& boundary, Node& text, unsigned offset, unsigned length)
 {
     if (boundary.container() != &text)

Modified: trunk/Source/WebCore/dom/Range.h (263301 => 263302)


--- trunk/Source/WebCore/dom/Range.h	2020-06-20 00:11:31 UTC (rev 263301)
+++ trunk/Source/WebCore/dom/Range.h	2020-06-20 00:16:12 UTC (rev 263302)
@@ -127,6 +127,8 @@
     void nodeChildrenChanged(ContainerNode&);
     void nodeChildrenWillBeRemoved(ContainerNode&);
     void nodeWillBeRemoved(Node&);
+    bool parentlessNodeMovedToNewDocumentAffectsRange(Node&);
+    void updateRangeForParentlessNodeMovedToNewDocument(Node&);
 
     void textInserted(Node&, unsigned offset, unsigned length);
     void textRemoved(Node&, unsigned offset, unsigned length);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to