blob: 2ef8c8ca281d8c5cb50cec894faeba444cc5927d [file] [log] [blame]
/*
* Copyright (C) 2004 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef VisibleUnits_h
#define VisibleUnits_h
#include "core/CoreExport.h"
#include "core/editing/EditingBoundary.h"
#include "core/editing/PositionWithAffinity.h"
#include "core/editing/VisiblePosition.h"
#include "platform/text/TextDirection.h"
namespace blink {
class LayoutRect;
class LayoutUnit;
class LayoutObject;
class Node;
class IntPoint;
class InlineBox;
class LocalFrame;
enum EWordSide { RightWordIfOnBoundary = false, LeftWordIfOnBoundary = true };
struct InlineBoxPosition {
InlineBox* inlineBox;
int offsetInBox;
InlineBoxPosition() : inlineBox(nullptr), offsetInBox(0) {}
InlineBoxPosition(InlineBox* inlineBox, int offsetInBox)
: inlineBox(inlineBox), offsetInBox(offsetInBox) {}
bool operator==(const InlineBoxPosition& other) const {
return inlineBox == other.inlineBox && offsetInBox == other.offsetInBox;
}
bool operator!=(const InlineBoxPosition& other) const {
return !operator==(other);
}
};
// The print for |InlineBoxPosition| is available only for testing
// in "webkit_unit_tests", and implemented in
// "core/editing/VisibleUnitsTest.cpp".
std::ostream& operator<<(std::ostream&, const InlineBoxPosition&);
CORE_EXPORT LayoutObject* associatedLayoutObjectOf(const Node&,
int offsetInNode);
// offset functions on Node
CORE_EXPORT int caretMinOffset(const Node*);
CORE_EXPORT int caretMaxOffset(const Node*);
// Position
// mostForward/BackwardCaretPosition are used for moving back and forth between
// visually equivalent candidates.
// For example, for the text node "foo bar" where whitespace is
// collapsible, there are two candidates that map to the VisiblePosition
// between 'b' and the space, after first space and before last space.
//
// mostBackwardCaretPosition returns the left candidate and also returs
// [boundary, 0] for any of the positions from [boundary, 0] to the first
// candidate in boundary, where
// endsOfNodeAreVisuallyDistinctPositions(boundary) is true.
//
// mostForwardCaretPosition() returns the right one and also returns the
// last position in the last atomic node in boundary for all of the positions
// in boundary after the last candidate, where
// endsOfNodeAreVisuallyDistinctPositions(boundary).
// FIXME: This function should never be called when the line box tree is dirty.
// See https://bugs.webkit.org/show_bug.cgi?id=97264
CORE_EXPORT Position mostBackwardCaretPosition(
const Position&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT PositionInFlatTree mostBackwardCaretPosition(
const PositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT Position mostForwardCaretPosition(
const Position&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT PositionInFlatTree mostForwardCaretPosition(
const PositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT bool isVisuallyEquivalentCandidate(const Position&);
CORE_EXPORT bool isVisuallyEquivalentCandidate(const PositionInFlatTree&);
// Whether or not [node, 0] and [node, lastOffsetForEditing(node)] are their own
// VisiblePositions.
// If true, adjacent candidates are visually distinct.
CORE_EXPORT bool endsOfNodeAreVisuallyDistinctPositions(const Node*);
CORE_EXPORT Position canonicalPositionOf(const Position&);
CORE_EXPORT PositionInFlatTree canonicalPositionOf(const PositionInFlatTree&);
// Bounds of (possibly transformed) caret in absolute coords
CORE_EXPORT IntRect absoluteCaretBoundsOf(const VisiblePosition&);
CORE_EXPORT IntRect absoluteCaretBoundsOf(const VisiblePositionInFlatTree&);
CORE_EXPORT UChar32 characterAfter(const VisiblePosition&);
CORE_EXPORT UChar32 characterAfter(const VisiblePositionInFlatTree&);
CORE_EXPORT UChar32 characterBefore(const VisiblePosition&);
CORE_EXPORT UChar32 characterBefore(const VisiblePositionInFlatTree&);
// TODO(yosin) Since return value of |leftPositionOf()| with |VisiblePosition|
// isn't defined well on flat tree, we should not use it for a position in
// flat tree.
CORE_EXPORT VisiblePosition leftPositionOf(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
leftPositionOf(const VisiblePositionInFlatTree&);
// TODO(yosin) Since return value of |rightPositionOf()| with |VisiblePosition|
// isn't defined well on flat tree, we should not use it for a position in
// flat tree.
CORE_EXPORT VisiblePosition rightPositionOf(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
rightPositionOf(const VisiblePositionInFlatTree&);
CORE_EXPORT VisiblePosition
nextPositionOf(const VisiblePosition&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree
nextPositionOf(const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePosition
previousPositionOf(const VisiblePosition&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree
previousPositionOf(const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
// These deprecated functions perform synchronous layout, messing up the
// rendering pipeline. They may also take invalid VisiblePositions as their
// arguments. Callers should ensure clean layout and pass valid VisiblePositions
// to the un-deprecated functions listed above.
CORE_EXPORT VisiblePosition
nextPositionOfDeprecated(const VisiblePosition&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree
nextPositionOfDeprecated(const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePosition previousPositionOfDeprecated(
const VisiblePosition&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree previousPositionOfDeprecated(
const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CanCrossEditingBoundary);
// words
CORE_EXPORT VisiblePosition startOfWord(const VisiblePosition&,
EWordSide = RightWordIfOnBoundary);
CORE_EXPORT VisiblePositionInFlatTree
startOfWord(const VisiblePositionInFlatTree&,
EWordSide = RightWordIfOnBoundary);
CORE_EXPORT VisiblePosition endOfWord(const VisiblePosition&,
EWordSide = RightWordIfOnBoundary);
CORE_EXPORT VisiblePositionInFlatTree
endOfWord(const VisiblePositionInFlatTree&, EWordSide = RightWordIfOnBoundary);
VisiblePosition previousWordPosition(const VisiblePosition&);
VisiblePosition nextWordPosition(const VisiblePosition&);
VisiblePosition rightWordPosition(const VisiblePosition&,
bool skipsSpaceWhenMovingRight);
VisiblePosition leftWordPosition(const VisiblePosition&,
bool skipsSpaceWhenMovingRight);
// sentences
CORE_EXPORT VisiblePosition startOfSentence(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
startOfSentence(const VisiblePositionInFlatTree&);
CORE_EXPORT VisiblePosition endOfSentence(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
endOfSentence(const VisiblePositionInFlatTree&);
VisiblePosition previousSentencePosition(const VisiblePosition&);
VisiblePosition nextSentencePosition(const VisiblePosition&);
// lines
// TODO(yosin) Return values of |VisiblePosition| version of |startOfLine()|
// with shadow tree isn't defined well. We should not use it for shadow tree.
CORE_EXPORT VisiblePosition startOfLine(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
startOfLine(const VisiblePositionInFlatTree&);
// TODO(yosin) Return values of |VisiblePosition| version of |endOfLine()| with
// shadow tree isn't defined well. We should not use it for shadow tree.
CORE_EXPORT VisiblePosition endOfLine(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
endOfLine(const VisiblePositionInFlatTree&);
enum EditableType { ContentIsEditable, HasEditableAXRole };
CORE_EXPORT VisiblePosition
previousLinePosition(const VisiblePosition&,
LayoutUnit lineDirectionPoint,
EditableType = ContentIsEditable);
CORE_EXPORT VisiblePosition nextLinePosition(const VisiblePosition&,
LayoutUnit lineDirectionPoint,
EditableType = ContentIsEditable);
CORE_EXPORT bool inSameLine(const VisiblePosition&, const VisiblePosition&);
CORE_EXPORT bool inSameLine(const VisiblePositionInFlatTree&,
const VisiblePositionInFlatTree&);
CORE_EXPORT bool inSameLine(const PositionWithAffinity&,
const PositionWithAffinity&);
CORE_EXPORT bool inSameLine(const PositionInFlatTreeWithAffinity&,
const PositionInFlatTreeWithAffinity&);
CORE_EXPORT bool isStartOfLine(const VisiblePosition&);
CORE_EXPORT bool isStartOfLine(const VisiblePositionInFlatTree&);
CORE_EXPORT bool isEndOfLine(const VisiblePosition&);
CORE_EXPORT bool isEndOfLine(const VisiblePositionInFlatTree&);
// TODO(yosin) Return values of |VisiblePosition| version of
// |logicalStartOfLine()| with shadow tree isn't defined well. We should not use
// it for shadow tree.
CORE_EXPORT VisiblePosition logicalStartOfLine(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
logicalStartOfLine(const VisiblePositionInFlatTree&);
// TODO(yosin) Return values of |VisiblePosition| version of
// |logicalEndOfLine()| with shadow tree isn't defined well. We should not use
// it for shadow tree.
CORE_EXPORT VisiblePosition logicalEndOfLine(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
logicalEndOfLine(const VisiblePositionInFlatTree&);
CORE_EXPORT bool isLogicalEndOfLine(const VisiblePosition&);
CORE_EXPORT bool isLogicalEndOfLine(const VisiblePositionInFlatTree&);
VisiblePosition leftBoundaryOfLine(const VisiblePosition&, TextDirection);
VisiblePosition rightBoundaryOfLine(const VisiblePosition&, TextDirection);
// paragraphs (perhaps a misnomer, can be divided by line break elements)
// TODO(yosin) Since return value of |startOfParagraph()| with |VisiblePosition|
// isn't defined well on flat tree, we should not use it for a position in
// flat tree.
CORE_EXPORT VisiblePosition
startOfParagraph(const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree
startOfParagraph(const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT VisiblePosition
endOfParagraph(const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree
endOfParagraph(const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
VisiblePosition startOfNextParagraph(const VisiblePosition&);
VisiblePosition previousParagraphPosition(const VisiblePosition&, LayoutUnit x);
VisiblePosition nextParagraphPosition(const VisiblePosition&, LayoutUnit x);
CORE_EXPORT bool isStartOfParagraph(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT bool isStartOfParagraph(
const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT bool isEndOfParagraph(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT bool isEndOfParagraph(
const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
bool inSameParagraph(const VisiblePosition&,
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
// These deprecated functions perform synchronous layout, messing up the
// rendering pipeline. They may also take invalid VisiblePositions as their
// arguments. Callers should ensure clean layout and pass valid VisiblePositions
// to the un-deprecated functions listed above.
CORE_EXPORT VisiblePosition startOfParagraphDeprecated(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree startOfParagraphDeprecated(
const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT VisiblePosition endOfParagraphDeprecated(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT VisiblePositionInFlatTree endOfParagraphDeprecated(
const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
VisiblePosition startOfNextParagraphDeprecated(const VisiblePosition&);
CORE_EXPORT bool isStartOfParagraphDeprecated(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT bool isStartOfParagraphDeprecated(
const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT bool isEndOfParagraphDeprecated(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT bool isEndOfParagraphDeprecated(
const VisiblePositionInFlatTree&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
bool inSameParagraphDeprecated(
const VisiblePosition&,
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
// blocks (true paragraphs; line break elements don't break blocks)
VisiblePosition startOfBlock(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
VisiblePosition endOfBlock(
const VisiblePosition&,
EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
bool inSameBlock(const VisiblePosition&, const VisiblePosition&);
bool isStartOfBlock(const VisiblePosition&);
bool isEndOfBlock(const VisiblePosition&);
// document
CORE_EXPORT VisiblePosition startOfDocument(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
startOfDocument(const VisiblePositionInFlatTree&);
CORE_EXPORT VisiblePosition endOfDocument(const VisiblePosition&);
CORE_EXPORT VisiblePositionInFlatTree
endOfDocument(const VisiblePositionInFlatTree&);
bool isStartOfDocument(const VisiblePosition&);
bool isEndOfDocument(const VisiblePosition&);
// editable content
VisiblePosition startOfEditableContent(const VisiblePosition&);
VisiblePosition endOfEditableContent(const VisiblePosition&);
CORE_EXPORT bool isEndOfEditableOrNonEditableContent(const VisiblePosition&);
CORE_EXPORT bool isEndOfEditableOrNonEditableContent(
const VisiblePositionInFlatTree&);
CORE_EXPORT InlineBoxPosition computeInlineBoxPosition(const Position&,
TextAffinity);
CORE_EXPORT InlineBoxPosition
computeInlineBoxPosition(const Position&,
TextAffinity,
TextDirection primaryDirection);
CORE_EXPORT InlineBoxPosition
computeInlineBoxPosition(const PositionInFlatTree&, TextAffinity);
CORE_EXPORT InlineBoxPosition
computeInlineBoxPosition(const PositionInFlatTree&,
TextAffinity,
TextDirection primaryDirection);
CORE_EXPORT InlineBoxPosition computeInlineBoxPosition(const VisiblePosition&);
CORE_EXPORT InlineBoxPosition
computeInlineBoxPosition(const VisiblePositionInFlatTree&);
// Rect is local to the returned layoutObject
CORE_EXPORT LayoutRect localCaretRectOfPosition(const PositionWithAffinity&,
LayoutObject*&);
CORE_EXPORT LayoutRect
localCaretRectOfPosition(const PositionInFlatTreeWithAffinity&, LayoutObject*&);
bool hasRenderedNonAnonymousDescendantsWithHeight(LayoutObject*);
// Returns a hit-tested VisiblePosition for the given point in contents-space
// coordinates.
CORE_EXPORT VisiblePosition visiblePositionForContentsPoint(const IntPoint&,
LocalFrame*);
CORE_EXPORT bool rendersInDifferentPosition(const Position&, const Position&);
} // namespace blink
#endif // VisibleUnits_h