| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 | 47 |
| 48 // This file contains a set of helper functions used by the editing commands | 48 // This file contains a set of helper functions used by the editing commands |
| 49 | 49 |
| 50 // ------------------------------------------------------------------------- | 50 // ------------------------------------------------------------------------- |
| 51 // Node | 51 // Node |
| 52 // ------------------------------------------------------------------------- | 52 // ------------------------------------------------------------------------- |
| 53 | 53 |
| 54 // Functions returning Node | 54 // Functions returning Node |
| 55 | 55 |
| 56 Result<Node> highestAncestor(const Handle<Node>&); | 56 Result<Node> highestAncestor(const Handle<Node>&); |
| 57 Node* highestEditableRoot(const Position&, EditableType = ContentIsEditable); | 57 Result<Node> highestEditableRoot(const Position&, EditableType = ContentIsEditab
le); |
| 58 | 58 |
| 59 Node* highestEnclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Nod
e*), | 59 Result<Node> highestEnclosingNodeOfType(const Position&, bool (*nodeIsOfType)(co
nst Handle<const Node>&), |
| 60 EditingBoundaryCrossingRule = CannotCrossEditingBoundary, Node* stayWithin =
0); | 60 EditingBoundaryCrossingRule = CannotCrossEditingBoundary, const Handle<Node>
& stayWithin = nullptr); |
| 61 Node* highestNodeToRemoveInPruning(Node*); | 61 Result<Node> highestNodeToRemoveInPruning(const Handle<Node>&); |
| 62 Node* lowestEditableAncestor(Node*); | 62 Result<Node> lowestEditableAncestor(const Handle<Node>&); |
| 63 | 63 |
| 64 Result<Element> enclosingBlock(Node*, EditingBoundaryCrossingRule = CannotCrossE
ditingBoundary); | 64 Result<Element> enclosingBlock(const Handle<Node>&, EditingBoundaryCrossingRule
= CannotCrossEditingBoundary); |
| 65 Node* enclosingTableCell(const Position&); | 65 Result<Node> enclosingTableCell(const Position&); |
| 66 Node* enclosingEmptyListItem(const VisiblePosition&); | 66 Result<Node> enclosingEmptyListItem(const VisiblePosition&); |
| 67 Node* enclosingAnchorElement(const Position&); | 67 Result<Node> enclosingAnchorElement(const Position&); |
| 68 Node* enclosingNodeWithTag(const Position&, const QualifiedName&); | 68 Result<Node> enclosingNodeWithTag(const Position&, const QualifiedName&); |
| 69 Node* enclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Node*), Ed
itingBoundaryCrossingRule = CannotCrossEditingBoundary); | 69 Result<Node> enclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Han
dle<const Node>&), EditingBoundaryCrossingRule = CannotCrossEditingBoundary); |
| 70 | 70 |
| 71 Node* tabSpanNode(const Node*); | 71 Result<Node> tabSpanNode(const Handle<const Node>&); |
| 72 Node* isLastPositionBeforeTable(const VisiblePosition&); | 72 Result<Node> isLastPositionBeforeTable(const VisiblePosition&); |
| 73 Node* isFirstPositionAfterTable(const VisiblePosition&); | 73 Result<Node> isFirstPositionAfterTable(const VisiblePosition&); |
| 74 | 74 |
| 75 // offset functions on Node | 75 // offset functions on Node |
| 76 | 76 |
| 77 int lastOffsetForEditing(const Node*); | 77 int lastOffsetForEditing(const Handle<const Node>&); |
| 78 int caretMinOffset(const Node*); | 78 int caretMinOffset(const Handle<const Node>&); |
| 79 int caretMaxOffset(const Node*); | 79 int caretMaxOffset(const Handle<const Node>&); |
| 80 | 80 |
| 81 // boolean functions on Node | 81 // boolean functions on Node |
| 82 | 82 |
| 83 // FIXME: editingIgnoresContent, canHaveChildrenForEditing, and isAtomicNode | 83 // FIXME: editingIgnoresContent, canHaveChildrenForEditing, and isAtomicNode |
| 84 // should be renamed to reflect its usage. | 84 // should be renamed to reflect its usage. |
| 85 | 85 |
| 86 // Returns true for nodes that either have no content, or have content that is i
gnored (skipped over) while editing. | 86 // Returns true for nodes that either have no content, or have content that is i
gnored (skipped over) while editing. |
| 87 // There are no VisiblePositions inside these nodes. | 87 // There are no VisiblePositions inside these nodes. |
| 88 inline bool editingIgnoresContent(const Node* node) | 88 inline bool editingIgnoresContent(const Handle<const Node>& node) |
| 89 { | 89 { |
| 90 return !node->canContainRangeEndPoint(); | 90 return !node->canContainRangeEndPoint(); |
| 91 } | 91 } |
| 92 | 92 |
| 93 inline bool canHaveChildrenForEditing(const Node* node) | 93 inline bool canHaveChildrenForEditing(const Handle<const Node>& node) |
| 94 { | 94 { |
| 95 return !node->isTextNode() && node->canContainRangeEndPoint(); | 95 return !node->isTextNode() && node->canContainRangeEndPoint(); |
| 96 } | 96 } |
| 97 | 97 |
| 98 bool isAtomicNode(const Node*); | 98 bool isAtomicNode(const Handle<const Node>&); |
| 99 bool isBlock(const Node*); | 99 bool isBlock(const Handle<const Node>&); |
| 100 bool isInline(const Node*); | 100 bool isInline(const Handle<const Node>&); |
| 101 bool isSpecialElement(const Node*); | 101 bool isSpecialElement(const Handle<const Node>&); |
| 102 bool isTabSpanNode(const Node*); | 102 bool isTabSpanNode(const Handle<const Node>&); |
| 103 bool isTabSpanTextNode(const Node*); | 103 bool isTabSpanTextNode(const Handle<const Node>&); |
| 104 bool isMailBlockquote(const Node*); | 104 bool isMailBlockquote(const Handle<const Node>&); |
| 105 bool isTableElement(Node*); | 105 bool isTableElement(const Handle<Node>&); |
| 106 bool isTableCell(const Node*); | 106 bool isTableCell(const Handle<const Node>&); |
| 107 bool isEmptyTableCell(const Node*); | 107 bool isEmptyTableCell(const Handle<const Node>&); |
| 108 bool isTableStructureNode(const Node*); | 108 bool isTableStructureNode(const Handle<const Node>&); |
| 109 bool isListElement(Node*); | 109 bool isListElement(const Handle<Node>&); |
| 110 bool isListItem(const Node*); | 110 bool isListItem(const Handle<const Node>&); |
| 111 bool isNodeRendered(const Node*); | 111 bool isNodeRendered(const Handle<const Node>&); |
| 112 bool isNodeVisiblyContainedWithin(Node*, const Handle<const Range>&); | 112 bool isNodeVisiblyContainedWithin(const Handle<Node>&, const Handle<const Range>
&); |
| 113 bool isRenderedAsNonInlineTableImageOrHR(const Node*); | 113 bool isRenderedAsNonInlineTableImageOrHR(const Handle<const Node>&); |
| 114 bool areIdenticalElements(const Node*, const Node*); | 114 bool areIdenticalElements(const Handle<const Node>&, const Handle<const Node>&); |
| 115 bool isNonTableCellHTMLBlockElement(const Node*); | 115 bool isNonTableCellHTMLBlockElement(const Handle<const Node>&); |
| 116 TextDirection directionOfEnclosingBlock(const Position&); | 116 TextDirection directionOfEnclosingBlock(const Position&); |
| 117 | 117 |
| 118 // ------------------------------------------------------------------------- | 118 // ------------------------------------------------------------------------- |
| 119 // Position | 119 // Position |
| 120 // ------------------------------------------------------------------------- | 120 // ------------------------------------------------------------------------- |
| 121 | 121 |
| 122 // Functions returning Position | 122 // Functions returning Position |
| 123 | 123 |
| 124 Position nextCandidate(const Position&); | 124 Position nextCandidate(const Position&); |
| 125 Position previousCandidate(const Position&); | 125 Position previousCandidate(const Position&); |
| 126 | 126 |
| 127 Position nextVisuallyDistinctCandidate(const Position&); | 127 Position nextVisuallyDistinctCandidate(const Position&); |
| 128 Position previousVisuallyDistinctCandidate(const Position&); | 128 Position previousVisuallyDistinctCandidate(const Position&); |
| 129 | 129 |
| 130 Position positionOutsideTabSpan(const Position&); | 130 Position positionOutsideTabSpan(const Position&); |
| 131 Position positionBeforeContainingSpecialElement(const Position&, Node** containi
ngSpecialElement = 0); | 131 Position positionBeforeContainingSpecialElement(const Position&, Handle<Node>* c
ontainingSpecialElement = 0); |
| 132 Position positionAfterContainingSpecialElement(const Position&, Node** containin
gSpecialElement = 0); | 132 Position positionAfterContainingSpecialElement(const Position&, Handle<Node>* co
ntainingSpecialElement = 0); |
| 133 Position positionOutsideContainingSpecialElement(const Position&, Node** contain
ingSpecialElement = 0); | 133 Position positionOutsideContainingSpecialElement(const Position&, Handle<Node>*
containingSpecialElement = 0); |
| 134 | 134 |
| 135 inline Position firstPositionInOrBeforeNode(Node* node) | 135 inline Position firstPositionInOrBeforeNode(const Handle<Node>& node) |
| 136 { | 136 { |
| 137 HandleScope scope; | 137 HandleScope scope; |
| 138 if (!node) | 138 if (!node) |
| 139 return Position(); | 139 return Position(); |
| 140 return editingIgnoresContent(node) ? positionBeforeNode(adoptRawResult(node)
) : firstPositionInNode(adoptRawResult(node)); | 140 return editingIgnoresContent(node) ? positionBeforeNode(node) : firstPositio
nInNode(node); |
| 141 } | 141 } |
| 142 | 142 |
| 143 inline Position lastPositionInOrAfterNode(Node* node) | 143 inline Position lastPositionInOrAfterNode(const Handle<Node>& node) |
| 144 { | 144 { |
| 145 HandleScope scope; | 145 HandleScope scope; |
| 146 if (!node) | 146 if (!node) |
| 147 return Position(); | 147 return Position(); |
| 148 return editingIgnoresContent(node) ? positionAfterNode(adoptRawResult(node))
: lastPositionInNode(adoptRawResult(node)); | 148 return editingIgnoresContent(node) ? positionAfterNode(node) : lastPositionI
nNode(node); |
| 149 } | 149 } |
| 150 | 150 |
| 151 // comparision functions on Position | 151 // comparision functions on Position |
| 152 | 152 |
| 153 int comparePositions(const Position&, const Position&); | 153 int comparePositions(const Position&, const Position&); |
| 154 | 154 |
| 155 // boolean functions on Position | 155 // boolean functions on Position |
| 156 | 156 |
| 157 enum EUpdateStyle { UpdateStyle, DoNotUpdateStyle }; | 157 enum EUpdateStyle { UpdateStyle, DoNotUpdateStyle }; |
| 158 bool isEditablePosition(const Position&, EditableType = ContentIsEditable, EUpda
teStyle = UpdateStyle); | 158 bool isEditablePosition(const Position&, EditableType = ContentIsEditable, EUpda
teStyle = UpdateStyle); |
| 159 bool isRichlyEditablePosition(const Position&, EditableType = ContentIsEditable)
; | 159 bool isRichlyEditablePosition(const Position&, EditableType = ContentIsEditable)
; |
| 160 bool isFirstVisiblePositionInSpecialElement(const Position&); | 160 bool isFirstVisiblePositionInSpecialElement(const Position&); |
| 161 bool isLastVisiblePositionInSpecialElement(const Position&); | 161 bool isLastVisiblePositionInSpecialElement(const Position&); |
| 162 bool lineBreakExistsAtPosition(const Position&); | 162 bool lineBreakExistsAtPosition(const Position&); |
| 163 bool isVisiblyAdjacent(const Position& first, const Position& second); | 163 bool isVisiblyAdjacent(const Position& first, const Position& second); |
| 164 bool isAtUnsplittableElement(const Position&); | 164 bool isAtUnsplittableElement(const Position&); |
| 165 | 165 |
| 166 // miscellaneous functions on Position | 166 // miscellaneous functions on Position |
| 167 | 167 |
| 168 unsigned numEnclosingMailBlockquotes(const Position&); | 168 unsigned numEnclosingMailBlockquotes(const Position&); |
| 169 void updatePositionForNodeRemoval(Position&, Node*); | 169 void updatePositionForNodeRemoval(Position&, const Handle<Node>&); |
| 170 | 170 |
| 171 // ------------------------------------------------------------------------- | 171 // ------------------------------------------------------------------------- |
| 172 // VisiblePosition | 172 // VisiblePosition |
| 173 // ------------------------------------------------------------------------- | 173 // ------------------------------------------------------------------------- |
| 174 | 174 |
| 175 // Functions returning VisiblePosition | 175 // Functions returning VisiblePosition |
| 176 | 176 |
| 177 VisiblePosition firstEditablePositionAfterPositionInRoot(const Position&, Node*)
; | 177 VisiblePosition firstEditablePositionAfterPositionInRoot(const Position&, const
Handle<Node>&); |
| 178 VisiblePosition lastEditablePositionBeforePositionInRoot(const Position&, Node*)
; | 178 VisiblePosition lastEditablePositionBeforePositionInRoot(const Position&, const
Handle<Node>&); |
| 179 VisiblePosition visiblePositionBeforeNode(Node*); | 179 VisiblePosition visiblePositionBeforeNode(const Handle<Node>&); |
| 180 VisiblePosition visiblePositionAfterNode(Node*); | 180 VisiblePosition visiblePositionAfterNode(const Handle<Node>&); |
| 181 | 181 |
| 182 bool lineBreakExistsAtVisiblePosition(const VisiblePosition&); | 182 bool lineBreakExistsAtVisiblePosition(const VisiblePosition&); |
| 183 | 183 |
| 184 int comparePositions(const VisiblePosition&, const VisiblePosition&); | 184 int comparePositions(const VisiblePosition&, const VisiblePosition&); |
| 185 | 185 |
| 186 int indexForVisiblePosition(const VisiblePosition&, Handle<ContainerNode>& scope
); | 186 int indexForVisiblePosition(const VisiblePosition&, Handle<ContainerNode>& scope
); |
| 187 VisiblePosition visiblePositionForIndex(int index, const Handle<ContainerNode>&
scope); | 187 VisiblePosition visiblePositionForIndex(int index, const Handle<ContainerNode>&
scope); |
| 188 | 188 |
| 189 // ------------------------------------------------------------------------- | 189 // ------------------------------------------------------------------------- |
| 190 // Range | 190 // Range |
| 191 // ------------------------------------------------------------------------- | 191 // ------------------------------------------------------------------------- |
| 192 | 192 |
| 193 // Functions returning Range | 193 // Functions returning Range |
| 194 | 194 |
| 195 Result<Range> createRange(const Handle<Document>&, const VisiblePosition& start,
const VisiblePosition& end, ExceptionCode&); | 195 Result<Range> createRange(const Handle<Document>&, const VisiblePosition& start,
const VisiblePosition& end, ExceptionCode&); |
| 196 Result<Range> extendRangeToWrappingNodes(const Handle<Range>& rangeToExtend, con
st Handle<const Range>& maximumRange, const Node* rootNode); | 196 Result<Range> extendRangeToWrappingNodes(const Handle<Range>& rangeToExtend, con
st Handle<const Range>& maximumRange, const Handle<const Node>& rootNode); |
| 197 | 197 |
| 198 // ------------------------------------------------------------------------- | 198 // ------------------------------------------------------------------------- |
| 199 // HTMLElement | 199 // HTMLElement |
| 200 // ------------------------------------------------------------------------- | 200 // ------------------------------------------------------------------------- |
| 201 | 201 |
| 202 // Functions returning HTMLElement | 202 // Functions returning HTMLElement |
| 203 | 203 |
| 204 Result<HTMLElement> createDefaultParagraphElement(const Handle<Document>&); | 204 Result<HTMLElement> createDefaultParagraphElement(const Handle<Document>&); |
| 205 Result<HTMLElement> createBreakElement(const Handle<Document>&); | 205 Result<HTMLElement> createBreakElement(const Handle<Document>&); |
| 206 Result<HTMLElement> createOrderedListElement(const Handle<Document>&); | 206 Result<HTMLElement> createOrderedListElement(const Handle<Document>&); |
| 207 Result<HTMLElement> createUnorderedListElement(const Handle<Document>&); | 207 Result<HTMLElement> createUnorderedListElement(const Handle<Document>&); |
| 208 Result<HTMLElement> createListItemElement(const Handle<Document>&); | 208 Result<HTMLElement> createListItemElement(const Handle<Document>&); |
| 209 Result<HTMLElement> createHTMLElement(const Handle<Document>&, const QualifiedNa
me&); | 209 Result<HTMLElement> createHTMLElement(const Handle<Document>&, const QualifiedNa
me&); |
| 210 Result<HTMLElement> createHTMLElement(const Handle<Document>&, const AtomicStrin
g&); | 210 Result<HTMLElement> createHTMLElement(const Handle<Document>&, const AtomicStrin
g&); |
| 211 | 211 |
| 212 Result<HTMLElement> enclosingList(Node*); | 212 Result<HTMLElement> enclosingList(const Handle<Node>&); |
| 213 Result<HTMLElement> outermostEnclosingList(Node*, Node* rootList = 0); | 213 Result<HTMLElement> outermostEnclosingList(const Handle<Node>&, const Handle<Nod
e>& rootList = nullptr); |
| 214 Node* enclosingListChild(Node*); | 214 Result<Node> enclosingListChild(const Handle<Node>&); |
| 215 | 215 |
| 216 // ------------------------------------------------------------------------- | 216 // ------------------------------------------------------------------------- |
| 217 // Element | 217 // Element |
| 218 // ------------------------------------------------------------------------- | 218 // ------------------------------------------------------------------------- |
| 219 | 219 |
| 220 // Functions returning Element | 220 // Functions returning Element |
| 221 | 221 |
| 222 Result<Element> createTabSpanElement(const Handle<Document>&); | 222 Result<Element> createTabSpanElement(const Handle<Document>&); |
| 223 Result<Element> createTabSpanElement(const Handle<Document>&, PassRefPtr<Node> t
abTextNode); | 223 Result<Element> createTabSpanElement(const Handle<Document>&, PassRefPtr<Node> t
abTextNode); |
| 224 Result<Element> createTabSpanElement(const Handle<Document>&, const String& tabT
ext); | 224 Result<Element> createTabSpanElement(const Handle<Document>&, const String& tabT
ext); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 254 // FIXME: this is required until 6853027 is fixed and text checking can do t
his for us. | 254 // FIXME: this is required until 6853027 is fixed and text checking can do t
his for us. |
| 255 return character == '\'' || character == rightSingleQuotationMark || charact
er == hebrewPunctuationGershayim; | 255 return character == '\'' || character == rightSingleQuotationMark || charact
er == hebrewPunctuationGershayim; |
| 256 } | 256 } |
| 257 | 257 |
| 258 String stringWithRebalancedWhitespace(const String&, bool startIsStartOfParagrap
h, bool endIsEndOfParagraph); | 258 String stringWithRebalancedWhitespace(const String&, bool startIsStartOfParagrap
h, bool endIsEndOfParagraph); |
| 259 const String& nonBreakingSpaceString(); | 259 const String& nonBreakingSpaceString(); |
| 260 | 260 |
| 261 } | 261 } |
| 262 | 262 |
| 263 #endif | 263 #endif |
| OLD | NEW |