- 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;