15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef htmlediting_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define htmlediting_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Position.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/EditingBoundary.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/text/TextDirection.h"
32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Forward.h"
33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/unicode/CharacterNames.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Element;
39df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLElement;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Node;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Position;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Range;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VisiblePosition;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VisibleSelection;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file contains a set of helper functions used by the editing commands
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Node
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions returning Node
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* highestAncestor(Node*);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* highestEditableRoot(const Position&, EditableType = ContentIsEditable);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* highestEnclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Node*),
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EditingBoundaryCrossingRule = CannotCrossEditingBoundary, Node* stayWithin = 0);
61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochNode* highestNodeToRemoveInPruning(Node*, Node* excludeNode = 0);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* lowestEditableAncestor(Node*);
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* enclosingBlock(Node*, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* enclosingTableCell(const Position&);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* enclosingEmptyListItem(const VisiblePosition&);
67e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochElement* enclosingAnchorElement(const Position&);
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* enclosingNodeWithTag(const Position&, const QualifiedName&);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* enclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* tabSpanNode(const Node*);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* isLastPositionBeforeTable(const VisiblePosition&);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* isFirstPositionAfterTable(const VisiblePosition&);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// offset functions on Node
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int lastOffsetForEditing(const Node*);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int caretMinOffset(const Node*);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int caretMaxOffset(const Node*);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// boolean functions on Node
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: editingIgnoresContent, canHaveChildrenForEditing, and isAtomicNode
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// should be renamed to reflect its usage.
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Returns true for nodes that either have no content, or have content that is ignored (skipped over) while editing.
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// There are no VisiblePositions inside these nodes.
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool editingIgnoresContent(const Node* node)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !node->canContainRangeEndPoint();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool canHaveChildrenForEditing(const Node* node)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !node->isTextNode() && node->canContainRangeEndPoint();
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isAtomicNode(const Node*);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isBlock(const Node*);
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isInline(const Node*);
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isSpecialElement(const Node*);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isTabSpanNode(const Node*);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isTabSpanTextNode(const Node*);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isMailBlockquote(const Node*);
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isTableElement(Node*);
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isTableCell(const Node*);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isEmptyTableCell(const Node*);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isTableStructureNode(const Node*);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isListElement(Node*);
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool isListItem(const Node*);
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isNodeRendered(const Node*);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isNodeVisiblyContainedWithin(Node*, const Range*);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isRenderedAsNonInlineTableImageOrHR(const Node*);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool areIdenticalElements(const Node*, const Node*);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isNonTableCellHTMLBlockElement(const Node*);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TextDirection directionOfEnclosingBlock(const Position&);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Position
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
12102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions returning Position
12302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Position nextCandidate(const Position&);
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Position previousCandidate(const Position&);
12602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Position nextVisuallyDistinctCandidate(const Position&);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Position previousVisuallyDistinctCandidate(const Position&);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Position positionOutsideTabSpan(const Position&);
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Position positionBeforeContainingSpecialElement(const Position&, Node** containingSpecialElement = 0);
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Position positionAfterContainingSpecialElement(const Position&, Node** containingSpecialElement = 0);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline Position firstPositionInOrBeforeNode(Node* node)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Position();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return editingIgnoresContent(node) ? positionBeforeNode(node) : firstPositionInNode(node);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline Position lastPositionInOrAfterNode(Node* node)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Position();
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return editingIgnoresContent(node) ? positionAfterNode(node) : lastPositionInNode(node);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// comparision functions on Position
14902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int comparePositions(const Position&, const Position&);
151e6d4491e48613634a83c1957c72759da80987961Ben Murdochint comparePositions(const PositionWithAffinity&, const PositionWithAffinity&);
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// boolean functions on Position
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum EUpdateStyle { UpdateStyle, DoNotUpdateStyle };
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isEditablePosition(const Position&, EditableType = ContentIsEditable, EUpdateStyle = UpdateStyle);
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isRichlyEditablePosition(const Position&, EditableType = ContentIsEditable);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool lineBreakExistsAtPosition(const Position&);
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isVisiblyAdjacent(const Position& first, const Position& second);
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isAtUnsplittableElement(const Position&);
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// miscellaneous functions on Position
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned numEnclosingMailBlockquotes(const Position&);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void updatePositionForNodeRemoval(Position&, Node*);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VisiblePosition
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
17002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions returning VisiblePosition
17202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)VisiblePosition firstEditablePositionAfterPositionInRoot(const Position&, Node*);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)VisiblePosition lastEditablePositionBeforePositionInRoot(const Position&, Node*);
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)VisiblePosition visiblePositionBeforeNode(Node*);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)VisiblePosition visiblePositionAfterNode(Node*);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool lineBreakExistsAtVisiblePosition(const VisiblePosition&);
17902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int comparePositions(const VisiblePosition&, const VisiblePosition&);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int indexForVisiblePosition(const VisiblePosition&, RefPtr<ContainerNode>& scope);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)VisiblePosition visiblePositionForIndex(int index, ContainerNode* scope);
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Range
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions returning Range
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
191df95704c49daea886ddad70775bda23618d6274dBen MurdochPassRefPtr<Range> createRange(PassRefPtr<Document>, const VisiblePosition& start, const VisiblePosition& end, ExceptionState&);
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// HTMLElement
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
19602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions returning HTMLElement
19802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLElement> createDefaultParagraphElement(Document*);
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLElement> createBreakElement(Document*);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLElement> createOrderedListElement(Document*);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLElement> createUnorderedListElement(Document*);
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLElement> createListItemElement(Document*);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLElement> createHTMLElement(Document*, const QualifiedName&);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLElement> createHTMLElement(Document*, const AtomicString&);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElement* enclosingList(Node*);
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElement* outermostEnclosingList(Node*, Node* rootList = 0);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* enclosingListChild(Node*);
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Element
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
21402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions returning Element
21602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Element> createTabSpanElement(Document*);
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Element> createTabSpanElement(Document*, PassRefPtr<Node> tabTextNode);
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Element> createTabSpanElement(Document*, const String& tabText);
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Element> createBlockPlaceholderElement(Document*);
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* editableRootForPosition(const Position&, EditableType = ContentIsEditable);
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* unsplittableElementForPosition(const Position&);
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Boolean functions on Element
22602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool canMergeLists(Element* firstList, Element* secondList);
22802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VisibleSelection
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------------------------------------------------------------
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions returning VisibleSelection
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)VisibleSelection selectionForParagraphIteration(const VisibleSelection&);
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Position adjustedSelectionStartForStyleComputation(const VisibleSelection&);
23702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Miscellaneous functions on Text
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isWhitespace(UChar c)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return c == noBreakSpace || c == ' ' || c == '\n' || c == '\t';
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isAmbiguousBoundaryCharacter(UChar character)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These are characters that can behave as word boundaries, but can appear within words.
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If they are just typed, i.e. if they are immediately followed by a caret, we want to delay text checking until the next character has been typed.
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: this is required until 6853027 is fixed and text checking can do this for us.
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return character == '\'' || character == rightSingleQuotationMark || character == hebrewPunctuationGershayim;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String stringWithRebalancedWhitespace(const String&, bool startIsStartOfParagraph, bool endIsEndOfParagraph);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const String& nonBreakingSpaceString();
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
259