summaryrefslogtreecommitdiffstats
path: root/WebCore/editing/VisiblePosition.cpp
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-05 14:34:32 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-05 14:34:32 -0800
commit635860845790a19bf50bbc51ba8fb66a96dde068 (patch)
treeef6ad9ff73a5b57f65249d4232a202fa77e6a140 /WebCore/editing/VisiblePosition.cpp
parent8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2 (diff)
downloadexternal_webkit-635860845790a19bf50bbc51ba8fb66a96dde068.zip
external_webkit-635860845790a19bf50bbc51ba8fb66a96dde068.tar.gz
external_webkit-635860845790a19bf50bbc51ba8fb66a96dde068.tar.bz2
auto import from //depot/cupcake/@136594
Diffstat (limited to 'WebCore/editing/VisiblePosition.cpp')
-rw-r--r--WebCore/editing/VisiblePosition.cpp43
1 files changed, 36 insertions, 7 deletions
diff --git a/WebCore/editing/VisiblePosition.cpp b/WebCore/editing/VisiblePosition.cpp
index 626c5b4..3d771c6 100644
--- a/WebCore/editing/VisiblePosition.cpp
+++ b/WebCore/editing/VisiblePosition.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,6 +29,7 @@
#include "CString.h"
#include "Document.h"
#include "Element.h"
+#include "FloatQuad.h"
#include "HTMLNames.h"
#include "InlineTextBox.h"
#include "Logging.h"
@@ -437,7 +438,7 @@ VisiblePosition VisiblePosition::honorEditableBoundaryAtOrAfter(const VisiblePos
return firstEditablePositionAfterPositionInRoot(pos.deepEquivalent(), highestRoot);
}
-Position canonicalizeCandidate(const Position& candidate)
+static Position canonicalizeCandidate(const Position& candidate)
{
if (candidate.isNull())
return Position();
@@ -523,13 +524,15 @@ UChar VisiblePosition::characterAfter() const
return textNode->data()[offset];
}
-IntRect VisiblePosition::caretRect() const
+IntRect VisiblePosition::localCaretRect(RenderObject*& renderer) const
{
Node* node = m_deepPosition.node();
- if (!node)
+ if (!node) {
+ renderer = 0;
return IntRect();
-
- RenderObject* renderer = node->renderer();
+ }
+
+ renderer = node->renderer();
if (!renderer)
return IntRect();
@@ -540,7 +543,30 @@ IntRect VisiblePosition::caretRect() const
if (inlineBox)
renderer = inlineBox->object();
- return renderer->caretRect(inlineBox, caretOffset);
+ return renderer->localCaretRect(inlineBox, caretOffset);
+}
+
+IntRect VisiblePosition::absoluteCaretBounds() const
+{
+ RenderObject* renderer;
+ IntRect localRect = localCaretRect(renderer);
+ if (localRect.isEmpty() || !renderer)
+ return IntRect();
+
+ return renderer->localToAbsoluteQuad(FloatRect(localRect)).enclosingBoundingBox();
+}
+
+int VisiblePosition::xOffsetForVerticalNavigation() const
+{
+ RenderObject* renderer;
+ IntRect localRect = localCaretRect(renderer);
+ if (localRect.isEmpty() || !renderer)
+ return 0;
+
+ // This ignores transforms on purpose, for now. Vertical navigation is done
+ // without consulting transforms, so that 'up' in transformed text is 'up'
+ // relative to the text, not absolute 'up'.
+ return renderer->localToAbsolute(localRect.location()).x();
}
void VisiblePosition::debugPosition(const char* msg) const
@@ -567,6 +593,9 @@ void VisiblePosition::showTreeForThis() const
PassRefPtr<Range> makeRange(const VisiblePosition &start, const VisiblePosition &end)
{
+ if (start.isNull() || end.isNull())
+ return 0;
+
Position s = rangeCompliantEquivalent(start);
Position e = rangeCompliantEquivalent(end);
return Range::create(s.node()->document(), s.node(), s.offset(), e.node(), e.offset());