Title: [92451] trunk/Source/WebCore
Revision
92451
Author
[email protected]
Date
2011-08-04 23:26:20 -0700 (Thu, 04 Aug 2011)

Log Message

Use RenderedPosition instead of getInlineBoxAndOffset in Editor and AccessibilityObject
https://bugs.webkit.org/show_bug.cgi?id=65647

Reviewed by Hajime Morita.

Encapsulated the use of getInlineBoxAndOffset in Editor.cpp and AccessibilityObject.cpp by RenderedPosition.

Also added rendererFromPosition that returns the renderer of deprecatedNode but using a proper Position interface.

* accessibility/AccessibilityObject.cpp:
(WebCore::updateAXLineStartForVisiblePosition):
* editing/Editor.cpp:
(WebCore::Editor::firstRectForRange):
* editing/RenderedPosition.cpp:
(WebCore::rendererFromPosition):
(WebCore::RenderedPosition::RenderedPosition):
(WebCore::RenderedPosition::absoluteRect):
* editing/RenderedPosition.h:
(WebCore::RenderedPosition::absoluteRect):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (92450 => 92451)


--- trunk/Source/WebCore/ChangeLog	2011-08-05 06:14:11 UTC (rev 92450)
+++ trunk/Source/WebCore/ChangeLog	2011-08-05 06:26:20 UTC (rev 92451)
@@ -1,3 +1,25 @@
+2011-08-04  Ryosuke Niwa  <[email protected]>
+
+        Use RenderedPosition instead of getInlineBoxAndOffset in Editor and AccessibilityObject
+        https://bugs.webkit.org/show_bug.cgi?id=65647
+
+        Reviewed by Hajime Morita.
+
+        Encapsulated the use of getInlineBoxAndOffset in Editor.cpp and AccessibilityObject.cpp by RenderedPosition.
+
+        Also added rendererFromPosition that returns the renderer of deprecatedNode but using a proper Position interface.
+
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::updateAXLineStartForVisiblePosition):
+        * editing/Editor.cpp:
+        (WebCore::Editor::firstRectForRange):
+        * editing/RenderedPosition.cpp:
+        (WebCore::rendererFromPosition):
+        (WebCore::RenderedPosition::RenderedPosition):
+        (WebCore::RenderedPosition::absoluteRect):
+        * editing/RenderedPosition.h:
+        (WebCore::RenderedPosition::absoluteRect):
+
 2011-08-04  Hayato Ito  <[email protected]>
 
         Make ScopedEventQueue enqueue an EventDispatchMediator, instead of an Event.

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (92450 => 92451)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2011-08-05 06:14:11 UTC (rev 92450)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2011-08-05 06:26:20 UTC (rev 92451)
@@ -49,6 +49,7 @@
 #include "RenderTheme.h"
 #include "RenderView.h"
 #include "RenderWidget.h"
+#include "RenderedPosition.h"
 #include "TextCheckerClient.h"
 #include "TextIterator.h"
 #include "htmlediting.h"
@@ -289,22 +290,15 @@
     // So let's update the position to include that.
     VisiblePosition tempPosition;
     VisiblePosition startPosition = visiblePosition;
-    Position p;
-    RenderObject* renderer;
     while (true) {
         tempPosition = startPosition.previous();
-        if (tempPosition.isNull())
+        if (tempPosition.isNull() || tempPosition.isNull())
             break;
-        p = tempPosition.deepEquivalent();
-        if (!p.deprecatedNode())
-            break;
-        renderer = p.deprecatedNode()->renderer();
+        Position p = tempPosition.deepEquivalent();
+        RenderObject* renderer = p.deprecatedNode()->renderer();
         if (!renderer || (renderer->isRenderBlock() && !p.deprecatedEditingOffset()))
             break;
-        InlineBox* box;
-        int ignoredCaretOffset;
-        p.getInlineBoxAndOffset(tempPosition.affinity(), box, ignoredCaretOffset);
-        if (box)
+        if (!RenderedPosition(tempPosition).isNull())
             break;
         startPosition = tempPosition;
     }

Modified: trunk/Source/WebCore/editing/Editor.cpp (92450 => 92451)


--- trunk/Source/WebCore/editing/Editor.cpp	2011-08-05 06:14:11 UTC (rev 92450)
+++ trunk/Source/WebCore/editing/Editor.cpp	2011-08-05 06:26:20 UTC (rev 92451)
@@ -71,6 +71,7 @@
 #include "RenderBlock.h"
 #include "RenderPart.h"
 #include "RenderTextControl.h"
+#include "RenderedPosition.h"
 #include "ReplaceSelectionCommand.h"
 #include "Settings.h"
 #include "Sound.h"
@@ -2733,32 +2734,14 @@
     ASSERT(range->startContainer());
     ASSERT(range->endContainer());
 
-    InlineBox* startInlineBox;
-    int startCaretOffset;
-    Position startPosition = VisiblePosition(range->startPosition()).deepEquivalent();
-    if (startPosition.isNull())
+    LayoutRect startCaretRect = RenderedPosition(VisiblePosition(range->startPosition()).deepEquivalent(), DOWNSTREAM).absoluteRect(extraWidthToEndOfLine);
+    if (startCaretRect == LayoutRect())
         return IntRect();
-    startPosition.getInlineBoxAndOffset(DOWNSTREAM, startInlineBox, startCaretOffset);
 
-    RenderObject* startRenderer = startPosition.deprecatedNode()->renderer();
-    ASSERT(startRenderer);
-    IntRect startCaretRect = startRenderer->localCaretRect(startInlineBox, startCaretOffset, &extraWidthToEndOfLine);
-    if (startCaretRect != IntRect())
-        startCaretRect = startRenderer->localToAbsoluteQuad(FloatRect(startCaretRect)).enclosingBoundingBox();
-
-    InlineBox* endInlineBox;
-    int endCaretOffset;
-    Position endPosition = VisiblePosition(range->endPosition()).deepEquivalent();
-    if (endPosition.isNull())
+    LayoutRect endCaretRect = RenderedPosition(VisiblePosition(range->endPosition()).deepEquivalent(), UPSTREAM).absoluteRect();
+    if (endCaretRect == LayoutRect())
         return IntRect();
-    endPosition.getInlineBoxAndOffset(UPSTREAM, endInlineBox, endCaretOffset);
 
-    RenderObject* endRenderer = endPosition.deprecatedNode()->renderer();
-    ASSERT(endRenderer);
-    IntRect endCaretRect = endRenderer->localCaretRect(endInlineBox, endCaretOffset);
-    if (endCaretRect != IntRect())
-        endCaretRect = endRenderer->localToAbsoluteQuad(FloatRect(endCaretRect)).enclosingBoundingBox();
-
     if (startCaretRect.y() == endCaretRect.y()) {
         // start and end are on the same line
         return IntRect(min(startCaretRect.x(), endCaretRect.x()),

Modified: trunk/Source/WebCore/editing/RenderedPosition.cpp (92450 => 92451)


--- trunk/Source/WebCore/editing/RenderedPosition.cpp	2011-08-05 06:14:11 UTC (rev 92450)
+++ trunk/Source/WebCore/editing/RenderedPosition.cpp	2011-08-05 06:26:20 UTC (rev 92451)
@@ -37,6 +37,33 @@
 
 namespace WebCore {
 
+static inline RenderObject* rendererFromPosition(const Position& position)
+{
+    ASSERT(position.isNotNull());
+    Node* rendererNode = 0;
+    switch (position.anchorType()) {
+    case Position::PositionIsOffsetInAnchor:
+        rendererNode = position.computeNodeAfterPosition();
+        if (!rendererNode || !rendererNode->renderer())
+            rendererNode = position.anchorNode()->lastChild();
+        break;
+
+    case Position::PositionIsBeforeAnchor:
+    case Position::PositionIsAfterAnchor:
+        break;
+
+    case Position::PositionIsBeforeChildren:
+        rendererNode = position.anchorNode()->firstChild();
+        break;
+    case Position::PositionIsAfterChildren:
+        rendererNode = position.anchorNode()->lastChild();
+        break;
+    }
+    if (!rendererNode || !rendererNode->renderer())
+        rendererNode = position.anchorNode();
+    return rendererNode->renderer();
+}
+
 RenderedPosition::RenderedPosition(const VisiblePosition& position)
     : m_renderer(0)
     , m_inlineBox(0)
@@ -47,6 +74,31 @@
     position.getInlineBoxAndOffset(m_inlineBox, m_offset);
     if (m_inlineBox)
         m_renderer = m_inlineBox->renderer();
+    else
+        m_renderer = rendererFromPosition(position.deepEquivalent());
 }
 
+RenderedPosition::RenderedPosition(const Position& position, EAffinity affinity)
+    : m_renderer(0)
+    , m_inlineBox(0)
+    , m_offset(0)
+{
+    if (position.isNull())
+        return;
+    position.getInlineBoxAndOffset(affinity, m_inlineBox, m_offset);
+    if (m_inlineBox)
+        m_renderer = m_inlineBox->renderer();
+    else
+        m_renderer = rendererFromPosition(position);
+}
+
+LayoutRect RenderedPosition::absoluteRect(int* extraWidthToEndOfLine) const
+{
+    if (isNull())
+        return LayoutRect();
+
+    LayoutRect localRect = m_renderer->localCaretRect(m_inlineBox, m_offset, extraWidthToEndOfLine);
+    return localRect == LayoutRect() ? LayoutRect() : m_renderer->localToAbsoluteQuad(FloatRect(localRect)).enclosingBoundingBox();
+}
+
 };

Modified: trunk/Source/WebCore/editing/RenderedPosition.h (92450 => 92451)


--- trunk/Source/WebCore/editing/RenderedPosition.h	2011-08-05 06:14:11 UTC (rev 92450)
+++ trunk/Source/WebCore/editing/RenderedPosition.h	2011-08-05 06:26:20 UTC (rev 92451)
@@ -32,6 +32,7 @@
 #define RenderedPosition_h
 
 #include "InlineBox.h"
+#include "LayoutTypes.h"
 #include "TextAffinity.h"
 
 namespace WebCore {
@@ -44,11 +45,17 @@
 public:
     RenderedPosition();
     explicit RenderedPosition(const VisiblePosition&);
+    explicit RenderedPosition(const Position&, EAffinity);
 
-    bool isNull() { return !m_renderer; }
+    bool isNull() const { return !m_renderer; }
     RootInlineBox* rootBox() { return m_inlineBox ? m_inlineBox->root() : 0; }
 
+    LayoutRect absoluteRect() const { return absoluteRect(0); }
+    LayoutRect absoluteRect(int& extraWidthToEndOfLine) const { return absoluteRect(&extraWidthToEndOfLine); }
+
 private:
+    LayoutRect absoluteRect(int* extraWidthToEndOfLine) const;
+
     RenderObject* m_renderer;
     InlineBox* m_inlineBox;
     int m_offset;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to