Upstream version 10.38.220.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / editing / Caret.cpp
index 8bdff9f..07647ce 100644 (file)
@@ -134,6 +134,29 @@ RenderBlock* CaretBase::caretRenderer(Node* node)
     return paintedByBlock ? toRenderBlock(renderer) : renderer->containingBlock();
 }
 
+static void mapCaretRectToCaretPainter(RenderObject* caretRenderer, RenderBlock* caretPainter, LayoutRect& caretRect)
+{
+    // FIXME: This shouldn't be called on un-rooted subtrees.
+    // FIXME: This should probably just use mapLocalToContainer.
+    // Compute an offset between the caretRenderer and the caretPainter.
+
+    ASSERT(caretRenderer->isDescendantOf(caretPainter));
+
+    bool unrooted = false;
+    while (caretRenderer != caretPainter) {
+        RenderObject* containerObject = caretRenderer->container();
+        if (!containerObject) {
+            unrooted = true;
+            break;
+        }
+        caretRect.move(caretRenderer->offsetFromContainer(containerObject, caretRect.location()));
+        caretRenderer = containerObject;
+    }
+
+    if (unrooted)
+        caretRect = LayoutRect();
+}
+
 bool CaretBase::updateCaretRect(Document* document, const PositionWithAffinity& caretPosition)
 {
     m_caretLocalRect = LayoutRect();
@@ -147,26 +170,13 @@ bool CaretBase::updateCaretRect(Document* document, const PositionWithAffinity&
 
     // First compute a rect local to the renderer at the selection start.
     RenderObject* renderer;
-    LayoutRect localRect = localCaretRectOfPosition(caretPosition, renderer);
+    m_caretLocalRect = localCaretRectOfPosition(caretPosition, renderer);
 
     // Get the renderer that will be responsible for painting the caret
     // (which is either the renderer we just found, or one of its containers).
     RenderBlock* caretPainter = caretRenderer(caretPosition.position().deprecatedNode());
 
-    // Compute an offset between the renderer and the caretPainter.
-    bool unrooted = false;
-    while (renderer != caretPainter) {
-        RenderObject* containerObject = renderer->container();
-        if (!containerObject) {
-            unrooted = true;
-            break;
-        }
-        localRect.move(renderer->offsetFromContainer(containerObject, localRect.location()));
-        renderer = containerObject;
-    }
-
-    if (!unrooted)
-        m_caretLocalRect = localRect;
+    mapCaretRectToCaretPainter(renderer, caretPainter, m_caretLocalRect);
 
     return true;
 }
@@ -203,6 +213,9 @@ void CaretBase::invalidateLocalCaretRect(Node* node, const LayoutRect& rect)
     LayoutRect inflatedRect = rect;
     inflatedRect.inflate(1);
 
+    // FIXME: We should use mapLocalToContainer() since we know we're not un-rooted.
+    mapCaretRectToCaretPainter(node->renderer(), caretPainter, inflatedRect);
+
     caretPainter->invalidatePaintRectangle(inflatedRect);
 }