diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-05 14:34:32 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-05 14:34:32 -0800 |
commit | 635860845790a19bf50bbc51ba8fb66a96dde068 (patch) | |
tree | ef6ad9ff73a5b57f65249d4232a202fa77e6a140 /WebCore/editing/VisiblePosition.cpp | |
parent | 8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2 (diff) | |
download | external_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.cpp | 43 |
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()); |