renderStyleOfEnclosingTextNode should update style before using a renderer
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Sep 2013 17:32:18 +0000 (17:32 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Sep 2013 17:32:18 +0000 (17:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121690

Reviewed by Enrica Casucci.

Merge https://chromium.googlesource.com/chromium/blink/+/65f089545e8c18cb268dfcbe56cba1cd8045527a

When accessing a renderer editing should always make sure that the style has been updated for the node.
Editing calls splitTextNode in a number of places and then accesses the renderer later. This patch is
the first of many to make sure editing always updates the style before attempting to access the renderer
(or style) of a node after calling a mutation method.

* editing/ApplyBlockElementCommand.cpp:
(WebCore::ApplyBlockElementCommand::renderStyleOfEnclosingTextNode):
* editing/ApplyBlockElementCommand.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@156180 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/editing/ApplyBlockElementCommand.cpp
Source/WebCore/editing/ApplyBlockElementCommand.h

index 345d9cb67f08b7671bc5a6c51108d86af16ac513..bbcaf688c2fc40bca2a14bf53b83c1bf88880f44 100644 (file)
@@ -1,3 +1,21 @@
+2013-09-20  Ryosuke Niwa  <rniwa@webkit.org>
+
+        renderStyleOfEnclosingTextNode should update style before using a renderer
+        https://bugs.webkit.org/show_bug.cgi?id=121690
+
+        Reviewed by Enrica Casucci.
+
+        Merge https://chromium.googlesource.com/chromium/blink/+/65f089545e8c18cb268dfcbe56cba1cd8045527a
+
+        When accessing a renderer editing should always make sure that the style has been updated for the node.
+        Editing calls splitTextNode in a number of places and then accesses the renderer later. This patch is
+        the first of many to make sure editing always updates the style before attempting to access the renderer
+        (or style) of a node after calling a mutation method.
+
+        * editing/ApplyBlockElementCommand.cpp:
+        (WebCore::ApplyBlockElementCommand::renderStyleOfEnclosingTextNode):
+        * editing/ApplyBlockElementCommand.h:
+
 2013-09-20  Darin Adler  <darin@apple.com>
 
         Fix a couple more CSS leaks
index c51c6b8f986cbe9cd78de19899ac82f395c1ec07..a9a58c89ef7a3aea6ee94b28145542a64b5e2fba 100644 (file)
@@ -169,14 +169,20 @@ static bool isNewLineAtPosition(const Position& position)
     return textAtPosition[0] == '\n';
 }
 
-static RenderStyle* renderStyleOfEnclosingTextNode(const Position& position)
+RenderStyle* ApplyBlockElementCommand::renderStyleOfEnclosingTextNode(const Position& position)
 {
     if (position.anchorType() != Position::PositionIsOffsetInAnchor
         || !position.containerNode()
-        || !position.containerNode()->isTextNode()
-        || !position.containerNode()->renderer())
+        || !position.containerNode()->isTextNode())
         return 0;
-    return position.containerNode()->renderer()->style();
+
+    document().updateStyleIfNeeded();
+
+    RenderObject* renderer = position.containerNode()->renderer();
+    if (!renderer)
+        return 0;
+
+    return renderer->style();
 }
 
 void ApplyBlockElementCommand::rangeForParagraphSplittingTextNodesIfNeeded(const VisiblePosition& endOfCurrentParagraph, Position& start, Position& end)
index c9bcb7c3f1312d6ed2b000bcce15ec74d5c115b4..452dc2a63b41cdb447962ae0ba3d2a8a018846d2 100644 (file)
@@ -48,6 +48,7 @@ protected:
 private:
     virtual void doApply();
     virtual void formatRange(const Position& start, const Position& end, const Position& endOfSelection, RefPtr<Element>&) = 0;
+    RenderStyle* renderStyleOfEnclosingTextNode(const Position&);
     void rangeForParagraphSplittingTextNodesIfNeeded(const VisiblePosition&, Position&, Position&);
     VisiblePosition endOfNextParagrahSplittingTextNodesIfNeeded(VisiblePosition&, Position&, Position&);